Title
Stage 2 accumulate incompatibilty
Status
c++11
Section
[facet.num.get.virtuals]
Submitter
Howard Hinnant

Created on 2011-03-09.00:00:00 last changed 153 months ago

Messages

Date: 2011-03-09.20:05:02

Proposed resolution:

Add to [facet.num.get.virtuals], Stage 2:

If discard is true, then if '.' has not yet been accumulated, then the position of the character is remembered, but the character is otherwise ignored. Otherwise, if '.' has already been accumulated, the character is discarded and Stage 2 terminates. If it is not discarded, then a check is made to determine if c is allowed as the next character of an input field of the conversion specifier returned by stage 1. If so it is accumulated.

If the character is either discarded or accumulated then in is advanced by ++in and processing returns to the beginning of stage 2.

Date: 2011-03-09.00:00:00

num_get Stage 2 accumulation changed between C++03 and the current C++0x working draft. The sentences:

If it is not discarded, then a check is made to determine if c is allowed as the next character of an input field of the conversion specifier returned by stage 1. If so it is accumulated.

have been dropped from [facet.num.get.virtuals], Stage 2, paragraph 3 that begins:

If discard is true, […]

Consider this code:

#include <sstream>
#include <iostream>

int main(void)
{
   std::istringstream s("8cz");
   long i = 0;
   char c;
   s >> i;
   if (!s.fail())
       std::cout << "i = " << i << '\n';
   else
   {
       std::cout << "s >> i failed\n";
       s.clear();
   }
   s >> c;
   if (!s.fail())
       std::cout << "c = " << c << '\n';
   else
       std::cout << "s >> c failed\n";
}

C++0x currently prints out:

s >> i failed
c = z

However C++03 conforming implementations will output:

i = 8
c = c

I believe we need to restore C++03 compatibility.

History
Date User Action Args
2011-08-23 20:07:26adminsetstatus: wp -> c++11
2011-04-11 11:23:23adminsetstatus: immediate -> wp
2011-03-24 16:04:34adminsetstatus: new -> immediate
2011-03-09 20:05:02adminsetmessages: + msg5638
2011-03-09 00:00:00admincreate