Section: 30.13 [time.parse] Status: C++20 Submitter: Tomasz Kamiński Opened: 2019-09-01 Last modified: 2021-02-25
Priority: 2
View other active issues in [time.parse].
View all other issues in [time.parse].
View all issues with C++20 status.
Discussion:
None of the parse manipulators for the chrono types
specifies the result of the extraction from the stream, as consequence
they cannot be chained with the other read operations (at least portably).
For example the following code is not required to work:
std::chrono::sys_stime s;
int x;
std::cin >> std::chrono::parse("%X", s) >> x;
[2019-10 Priority set to 2 after reflector discussion]
Previous resolution [SUPERSEDED]:This wording is relative to N4830.
[Drafting note: As a drive-by fix the Remarks element is also converted to a Constraints element. The wording integrates the resolution for LWG 3235.
Modify 30.13 [time.parse] as indicated:
-1- Each parse overload specified in this subclause calls
from_streamunqualified, so as to enable argument dependent lookup (6.5.4 [basic.lookup.argdep]). In the following paragraphs, letisdenote an object of typebasic_istream<charT, traits>and letIbebasic_istream<charT, traits>&, wherecharTandtraitsare template parameters in that context.template<class charT, class traits, class Alloc, class Parsable> unspecified parse(const basic_string<charT, traits, Alloc>& fmt, Parsable& tp);-2-
RemarksConstraints:This function shall not participate in overload resolution unlessThe expressionisfrom_stream(declval<basic_istream<charT, traits>&>(), fmt.c_str(), tp)a valid expressionwell-formed when treated as an unevaluated operand. -3- Returns: A manipulator such that, when extracted from athe expressionbasic_istream<charT, traits> is,is >> parse(fmt, tp)has typeI, valueis, and callsfrom_stream(is, fmt.c_str(), tp).template<class charT, class traits, class Alloc, class Parsable> unspecified parse(const basic_string<charT, traits, Alloc>& fmt, Parsable& tp, basic_string<charT, traits, Alloc>& abbrev);-4-
RemarksConstraints:This function shall not participate in overload resolution unlessThe expressionisfrom_stream(declval<basic_istream<charT, traits>&>(), fmt.c_str(), tp, addressof(abbrev))a valid expressionwell-formed when treated as an unevaluated operand. -5- Returns: A manipulator such that, when extracted from athe expressionbasic_istream<charT, traits> is,is >> parse(fmt, tp, abbrev)has typeI, valueis, and callsfrom_stream(is, fmt.c_str(), tp, addressof(abbrev)).template<class charT, class traits, class Alloc, class Parsable> unspecified parse(const basic_string<charT, traits, Alloc>& fmt, Parsable& tp, minutes& offset);-6-
RemarksConstraints:This function shall not participate in overload resolution unlessThe expressionisfrom_stream(declval<basic_istream<charT, traits>&>(), fmt.c_str(), tp, declval<basic_string<charT, traits, Alloc>*>()nullptr, &offset)a valid expressionwell-formed when treated as an unevaluated operand. -7- Returns: A manipulator such that, when extracted from athe expressionbasic_istream<charT, traits> is,is >> parse(fmt, tp, offset)has typeI, valueis, and callsfrom_stream(is, fmt.c_str(), tp, static_cast<basic_string<charT, traits, Alloc>*>(nullptr), &offset).template<class charT, class traits, class Alloc, class Parsable> unspecified parse(const basic_string<charT, traits, Alloc>& fmt, Parsable& tp, basic_string<charT, traits, Alloc>& abbrev, minutes& offset);-8-
RemarksConstraints:This function shall not participate in overload resolution unlessThe expressionisfrom_stream(declval<basic_istream<charT, traits>&>(), fmt.c_str(), tp, addressof(abbrev), &offset)a valid expressionwell-formed when treated as an unevaluated operand. -9- Returns: A manipulator such that, when extracted from athe expressionbasic_istream<charT, traits> is,is >> parse(fmt, tp, abbrev, offset)has typeI, valueis, and callsfrom_stream(is, fmt.c_str(), tp, addressof(abbrev), &offset).
[2020-02-13, Prague]
Issue wording has been rebased.
[2020-02 Status to Immediate on Friday morning in Prague.]
Proposed resolution:
This wording is relative to N4849.
Modify 30.13 [time.parse] as indicated:
-1- Each
parseoverload specified in this subclause callsfrom_streamunqualified, so as to enable argument dependent lookup (6.5.4 [basic.lookup.argdep]). In the following paragraphs, letisdenote an object of typebasic_istream<charT, traits>and letIbebasic_istream<charT, traits>&, wherecharTandtraitsare template parameters in that context.template<class charT, class traits, class Alloc, class Parsable> unspecified parse(const basic_string<charT, traits, Alloc>& fmt, Parsable& tp);-2- Constraints: The expression
isfrom_stream(declval<basic_istream<charT, traits>&>(), fmt.c_str(), tp)a valid expressionwell-formed when treated as an unevaluated operand. -3- Returns: A manipulator such that, when extracted from athe expressionbasic_istream<charT, traits> is,is >> parse(fmt, tp)has typeI, valueis, and callsfrom_stream(is, fmt.c_str(), tp).template<class charT, class traits, class Alloc, class Parsable> unspecified parse(const basic_string<charT, traits, Alloc>& fmt, Parsable& tp, basic_string<charT, traits, Alloc>& abbrev);-4- Constraints: The expression
isfrom_stream(declval<basic_istream<charT, traits>&>(), fmt.c_str(), tp, addressof(abbrev))a valid expressionwell-formed when treated as an unevaluated operand. -5- Returns: A manipulator such that, when extracted from athe expressionbasic_istream<charT, traits> is,is >> parse(fmt, tp, abbrev)has typeI, valueis, and callsfrom_stream(is, fmt.c_str(), tp, addressof(abbrev)).template<class charT, class traits, class Alloc, class Parsable> unspecified parse(const basic_string<charT, traits, Alloc>& fmt, Parsable& tp, minutes& offset);-6- Constraints: The expression
is well-formed when treated as an unevaluated operand. -7- Returns: A manipulator such thatfrom_stream(declval<basic_istream<charT, traits>&>(), fmt.c_str(), tp, declval<basic_string<charT, traits, Alloc>*>(), &offset), when extracted from athe expressionbasic_istream<charT, traits> is,is >> parse(fmt, tp, offset)has typeI, valueis, and callsfrom_stream(is, fmt.c_str(), tp, static_cast<basic_string<charT, traits, Alloc>*>(nullptr), &offset)template<class charT, class traits, class Alloc, class Parsable> unspecified parse(const basic_string<charT, traits, Alloc>& fmt, Parsable& tp, basic_string<charT, traits, Alloc>& abbrev, minutes& offset);-8- Constraints: The expression
isfrom_stream(declval<basic_istream<charT, traits>&>(), fmt.c_str(), tp, addressof(abbrev), &offset)a valid expressionwell-formed when treated as an unevaluated operand. -9- Returns: A manipulator such that, when extracted from athe expressionbasic_istream<charT, traits> is,is >> parse(fmt, tp, abbrev, offset)has typeI, valueis, and callsfrom_stream(is, fmt.c_str(), tp, addressof(abbrev), &offset).