This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of C++11 status.

810. Missing traits dependencies in operational semantics of extended manipulators

Section: 31.7.8 [ext.manip] Status: C++11 Submitter: Daniel Krügler Opened: 2008-03-01 Last modified: 2016-01-28

Priority: Not Prioritized

View all other issues in [ext.manip].

View all issues with C++11 status.

Discussion:

The recent draft (as well as the original proposal n2072) uses an operational semantic for get_money ([ext.manip]/4) and put_money ([ext.manip]/6), which uses

istreambuf_iterator<charT>

and

ostreambuf_iterator<charT>

resp, instead of the iterator instances, with explicitly provided traits argument (The operational semantic defined by f is also traits dependent). This is an obvious oversight because both *stream_buf c'tors expect a basic_streambuf<charT,traits> as argument.

The same problem occurs within the get_time and put_time semantic where additional to the problem we have an editorial issue in get_time (streambuf_iterator instead of istreambuf_iterator).

[ Batavia (2009-05): ]

This appears to be an issue of presentation.

We agree with the proposed resolution. Move to Tentatively Ready.

Proposed resolution:

In 31.7.8 [ext.manip]/4 within function f replace the first line

template <class charT, class traits, class moneyT> 
void f(basic_ios<charT, traits>& str, moneyT& mon, bool intl) { 
   typedef istreambuf_iterator<charT, traits> Iter;
   ...

In 31.7.8 [ext.manip]/5 remove the first template charT parameter:

template <class charT, class moneyT> unspecified put_money(const moneyT& mon, bool intl = false);

In 31.7.8 [ext.manip]/6 within function f replace the first line

template <class charT, class traits, class moneyT> 
void f(basic_ios<charT, traits>& str, const moneyT& mon, bool intl) { 
  typedef ostreambuf_iterator<charT, traits> Iter;
  ...

In 31.7.8 [ext.manip]/8 within function f replace the first line

template <class charT, class traits> 
void f(basic_ios<charT, traits>& str, struct tm *tmb, const charT *fmt) { 
  typedef istreambuf_iterator<charT, traits> Iter;
  ...

In 31.7.8 [ext.manip]/10 within function f replace the first line

template <class charT, class traits> 
void f(basic_ios<charT, traits>& str, const struct tm *tmb, const charT *fmt) { 
  typedef ostreambuf_iterator<charT, traits> Iter;
  ...

In 31.7 [iostream.format], Header <iomanip> synopsis change:

template <class charT, class moneyT> T8 put_money(const moneyT& mon, bool intl = false);