643. Impossible "as if" clauses

Section: 31.10.3 [filebuf], 28.3.4.3.3.3 [facet.num.put.virtuals] Status: CD1 Submitter: Daniel Krügler Opened: 2007-02-20 Last modified: 2016-01-28

Priority: Not Prioritized

View all issues with CD1 status.

Discussion:

The current standard 14882:2003(E) as well as N2134 have the following defects:

31.10.3 [filebuf]/5 says:

In order to support file I/O and multibyte/wide character conversion, conversions are performed using members of a facet, referred to as a_codecvt in following sections, obtained "as if" by

codecvt<charT,char,typename traits::state_type> a_codecvt =
  use_facet<codecvt<charT,char,typename traits::state_type> >(getloc());

use_facet returns a const facet reference and no facet is copyconstructible, so the codecvt construction should fail to compile.

A similar issue arises in 28.3.4.3.3.3 [facet.num.put.virtuals]/15 for num_punct.

Proposed resolution:

In 31.10.3 [filebuf]/5 change the "as if" code

const codecvt<charT,char,typename traits::state_type>& a_codecvt =
  use_facet<codecvt<charT,char,typename traits::state_type> >(getloc());

In 28.3.4.3.3.3 [facet.num.put.virtuals]/15 (This is para 5 in N2134) change

A local variable punct is initialized via

const numpunct<charT>& punct = use_facet< numpunct<charT> >(str.getloc() );

(Please note also the additional provided trailing semicolon)