diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index fd553a136d0..557d26043a1 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,7 @@
+2004-11-15 Paolo Carlini Reference ISO/IEC IS 14882:1998(E) Also see: The purpose of this document is to record the status of issues
which have come before the Library Working Group (LWG) of the ANSI
(J16) and ISO (WG21) C++ Standards Committee. Issues represent
potential defects in the ISO/IEC IS 14882:1998(E) document. Issues
- are not to be used to request new features or other extensions.
-
-
+
Doc. no.
-N1657=04-0097
+N1708=04-0148
Date:
-16 Jul 2004
+5 Nov 2004
-Project:
@@ -19,32 +19,32 @@
Reply to:
Matt Austern <austern@apple.com>
C++ Standard Library Active Issues List (Revision 31)
+
+C++ Standard Library Active Issues List (Revision 33)
This document contains only library issues which are actively being considered by the Library Working Group. That is, issues which have a - status of New, Open, - Ready, and Review. See - Library Defect Reports List for issues considered defects and - Library Closed Issues List for issues considered closed.
+ status of New, Open, + Ready, and Review. See + Library Defect Reports List for issues considered defects and + Library Closed Issues List for issues considered closed.The issues in these lists are not necessarily formal ISO Defect Reports (DR's). While some issues will eventually be elevated to @@ -69,7 +69,7 @@ presented in subsequent discussions.
For the most current official version of this document see - http://www.dkuug.dk/jtc1/sc22/wg21. + http://www.open-std.org/jtc1/sc22/wg21/. Requests for further information about this document should include the document number above, reference ISO/IEC 14882:1998(E), and be submitted to Information Technology Industry Council (ITI), 1250 Eye @@ -78,7 +78,7 @@
Public information as to how to obtain a copy of the C++ Standard, join the standards committee, submit an issue, or comment on an issue can be found in the comp.std.c++ FAQ. - Public discussion of C++ Standard related issues occurs on news:comp.std.c++. + Public discussion of C++ Standard related issues occurs on news:comp.std.c++.
For committee members, files available on the committee's private @@ -88,25 +88,33 @@ directory as the issues list files.
Issues are always given the status of New when +
Issues are always given the status of New when they first appear on the issues list. They may progress to - Open or Review while the LWG + Open or Review while the LWG is actively working on them. When the LWG has reached consensus on the disposition of an issue, the status will then change to - Dup, NAD, or Ready as appropriate. Once the full J16 committee votes to + Dup, NAD, or Ready as appropriate. Once the full J16 committee votes to forward Ready issues to the Project Editor, they are given the - status of Defect Report ( DR). These in turn may - become the basis for Technical Corrigenda (TC), + status of Defect Report ( DR). These in turn may + become the basis for Technical Corrigenda (TC), or are closed without action other than a Record of Response - (RR ). The intent of this LWG process is that + (RR ). The intent of this LWG process is that only issues which are truly defects in the Standard move to the formal ISO DR status.
Section: 22.2.2.1.2 [lib.facet.num.get.virtuals] Status: Open Submitter: Nathan Myers Date: 6 Aug 1998
+Section: 22.2.2.1.2 [lib.facet.num.get.virtuals] Status: Open Submitter: Nathan Myers Date: 6 Aug 1998
The current description of numeric input does not account for the possibility of overflow. This is an implicit result of changing the description to rely on the definition of scanf() (which fails to @@ -400,7 +408,7 @@ and hard to trace, so I will describe it briefly:
Proposed resolution:
-typo: 22.2.2.2.2 [lib.facet.num.put.virtuals], para 2, bullet 3. Strike "in." from +
typo: 22.2.2.2.2 [lib.facet.num.put.virtuals], para 2, bullet 3. Strike "in." from the end.
-Change 22.2.2.2 [lib.locale.nm.put], para 11, bullet 2 from:
+Change 22.2.2.2 [lib.locale.nm.put], para 11, bullet 2 from:
The sequence of chars accumulated in stage 2 would have caused scanf to report an input failure. ios_base::failbit is @@ -527,7 +535,7 @@ what kind of error happened. Martin will provide wording, Howard may help.]
-96. Vector<bool> is not a container
Section: 23.2.5 [lib.vector.bool] Status: Open Submitter: AFNOR Date: 7 Oct 1998
+96. Vector<bool> is not a container
Section: 23.2.5 [lib.vector.bool] Status: Open Submitter: AFNOR Date: 7 Oct 1998
vector<bool> is not a container as its reference and pointer types are not references and pointers.
@@ -585,8 +593,16 @@ problem, and 2) providing compiler vendors, authors, teachers, and of course users with specific suggestions as to how to apply the eventual solution.] +[Redmond: briefly discussed, since there are options for C++0x + that weren't reasonable for TC1. Two options were discussed. (1) + deprecate std::vector<bool> and introduce std::bit_vector. Then + gradually, over a period of years, we could reintroduce + std::vector<bool> but this time as an ordinary vector. (2) Change + iterarator and container requirements so that vector<bool> will + be a fully conforming container. These options are not mutually + exclusive.]
-130. Return type of container::erase(iterator) differs for associative containers
Section: 23.1.2 [lib.associative.reqmts], 23.1.1 [lib.sequence.reqmts] Status: Review Submitter: Andrew Koenig Date: 2 Mar 1999
+130. Return type of container::erase(iterator) differs for associative containers
Section: 23.1.2 [lib.associative.reqmts], 23.1.1 [lib.sequence.reqmts] Status: Ready Submitter: Andrew Koenig Date: 2 Mar 1999
Table 67 (23.1.1) says that container::erase(iterator) returns an iterator. Table 69 (23.1.2) says that in addition to this requirement, associative containers also say that container::erase(iterator) @@ -596,7 +612,7 @@ fail to meet the requirements for containers.
Proposed resolution:
-In 23.1.2 [lib.associative.reqmts], in Table 69 Associative container +In 23.1.2 [lib.associative.reqmts], in Table 69 Associative container requirements, change the return type of a.erase(q) from void to iterator. Change the assertion/not/pre/post-condition from "erases the element pointed to @@ -607,26 +623,27 @@ is returned."
-In 23.1.2 [lib.associative.reqmts], in Table 69 Associative container +In 23.1.2 [lib.associative.reqmts], in Table 69 Associative container requirements, change the return type of a.erase(q1, q2) from void to iterator. Change the assertion/not/pre/post-condition from "erases the elements in the range [q1, q2)" to "erases the elements in the range [q1, -q2). Returns an iterator pointing to the element immediately -following q2 prior to any elements being erased. If no such element -exists, a.end() is returned." +q2). Returns q2."
-In 23.3.1 [lib.map], in the map class synopsis; and -in 23.3.2 [lib.multimap], in the multimap class synopsis; and -in 23.3.3 [lib.set], in the set class synopsis; and -in 23.3.4 [lib.multiset], in the multiset class synopsis: +In 23.3.1 [lib.map], in the map class synopsis; and +in 23.3.2 [lib.multimap], in the multimap class synopsis; and +in 23.3.3 [lib.set], in the set class synopsis; and +in 23.3.4 [lib.multiset], in the multiset class synopsis: change the signature of the first erase overload to
-- iterator erase(iterator position); +iterator erase(iterator position);+and change the signature of the third erase overload to
+iterator erase(iterator first, iterator last); ++[Pre-Kona: reopened at the request of Howard Hinnant]
@@ -644,7 +661,7 @@ Matt provided wording.] ]
-197. max_size() underspecified
Section: 20.1.5 [lib.allocator.requirements], 23.1 [lib.container.requirements] Status: Open Submitter: Andy Sawyer Date: 21 Oct 1999
+197. max_size() underspecified
Section: 20.1.5 [lib.allocator.requirements], 23.1 [lib.container.requirements] Status: Open Submitter: Andy Sawyer Date: 21 Oct 1999
Must the value returned by max_size() be unchanged from call to call?
Must the value returned from max_size() be meaningful?
@@ -676,21 +693,21 @@ into account the actual currently available resources). This, obviously, has to be determined dynamically each time max_size() is called.Proposed resolution:
-Change 20.1.5 [lib.allocator.requirements] table 32 max_size() wording from:
+Change 20.1.5 [lib.allocator.requirements] table 32 max_size() wording from:
+(5.19 [expr.const]) that could ever meaningfully be passed to X::allocate
the largest value that can meaningfully be passed to X::allocate
to:
the value of the largest constant expression -(5.19 [expr.const]) that could ever meaningfully be passed to X::allocate-Change 23.1 [lib.container.requirements] table 65 max_size() wording from:
+Change 23.1 [lib.container.requirements] table 65 max_size() wording from:
size() of the largest possible container.
to:
the value of the largest constant expression -(5.19 [expr.const]) that could ever meaningfully be returned by X::size(). +(5.19 [expr.const]) that could ever meaningfully be returned by X::size().[Kona: The LWG informally discussed this and asked Andy Sawyer to submit @@ -699,7 +716,7 @@ an issue.]
[Tokyo: The LWG believes (1) above is the intended meaning.]
[Post-Tokyo: Beman Dawes supplied the above resolution at the -request of the LWG. 21.3.3 [lib.string.capacity] was not changed because it +request of the LWG. 21.3.3 [lib.string.capacity] was not changed because it references max_size() in 23.1. The term "compile-time" was avoided because it is not defined anywhere in the standard (even though it is used several places in the library clauses).]
@@ -710,7 +727,7 @@ function than as an allocator member function. For the latter, it is probably best thought of as an architectural limit. Nathan will provide new wording.]
-201. Numeric limits terminology wrong
Section: 18.2.1 [lib.limits] Status: Open Submitter: Stephen Cleary Date: 21 Dec 1999
+201. Numeric limits terminology wrong
Section: 18.2.1 [lib.limits] Status: Open Submitter: Stephen Cleary Date: 21 Dec 1999
In some places in this section, the terms "fundamental types" and "scalar types" are used when the term "arithmetic types" is intended. @@ -722,26 +739,34 @@ specializations of numeric_limits.
Change 18.2 [lib.support.limits] para 1 from:
-The headers <limits>, <climits>, and <cfloat> supply characteristics of implementation-dependent fundamental types (3.9.1).
+The headers <limits>, <climits>, and <cfloat> +supply characteristics of implementation-dependent fundamental types +(3.9.1).
to:
-The headers <limits>, <climits>, and <cfloat> supply characteristics of implementation-dependent arithmetic types (3.9.1).
+The headers <limits>, <climits>, and <cfloat> +supply characteristics of implementation-dependent arithmetic types +(3.9.1).
Change 18.2.1 [lib.limits] para 1 from:
-The numeric_limits component provides a C++ program with information about various properties of the implementation's representation of the fundamental +
The numeric_limits component provides a C++ program with +information about various properties of the implementation's +representation of the fundamental types.
to:
-@@ -772,14 +797,17 @@ types.The numeric_limits component provides a C++ program with information about various properties of the implementation's representation of the arithmetic +
The numeric_limits component provides a C++ program with +information about various properties of the implementation's +representation of the arithmetic types.
Change 18.2.1.1 [lib.numeric.limits] para 1 from:
-The member is_specialized makes it possible to distinguish between fundamental types, which have specializations, and non-scalar types, which +
The member is_specialized makes it possible to distinguish between +fundamental types, which have specializations, and non-scalar types, +which do not.
to:
-@@ -794,7 +822,7 @@ types and for user-defined types, and the standard doesn't make it clear how numeric_limits applies to each of those cases. A wholesale review of numeric_limits is needed. A paper would be welcome.]The member is_specialized makes it possible to distinguish between arithmetic types, which have specializations, and non-arithmetic types, +
The member is_specialized makes it possible to distinguish between +arithmetic types, which have specializations, and non-arithmetic types, which do not.
-233. Insertion hints in associative containers
Section: 23.1.2 [lib.associative.reqmts] Status: Open Submitter: Andrew Koenig Date: 30 Apr 2000
+233. Insertion hints in associative containers
Section: 23.1.2 [lib.associative.reqmts] Status: Open Submitter: Andrew Koenig Date: 30 Apr 2000
If mm is a multimap and p is an iterator into the multimap, then mm.insert(p, x) inserts @@ -829,7 +857,7 @@ proposed "before or after, if possible, otherwise [...]".
Proposed resolution:
-In table 69 "Associative Container Requirements" in 23.1.2 [lib.associative.reqmts], in the row for a.insert(p, t), +
In table 69 "Associative Container Requirements" in 23.1.2 [lib.associative.reqmts], in the row for a.insert(p, t), change
@@ -886,11 +914,11 @@ you can do it efficiently enough with a red-black tree, but there are other (perhaps better) balanced tree techniques that might differ enough to make the detailed semantics hard to satisfy."] -[Curaçao: Nathan should give us the alternative wording he +
[Curaçao: Nathan should give us the alternative wording he suggests so the LWG can decide between the two options.]
-247. vector, deque::insert complexity
Section: 23.2.4.3 [lib.vector.modifiers] Status: Open Submitter: Lisa Lippincott Date: 06 June 2000
+247. vector, deque::insert complexity
Section: 23.2.4.3 [lib.vector.modifiers] Status: Open Submitter: Lisa Lippincott Date: 06 June 2000
Paragraph 2 of 23.2.4.3 [lib.vector.modifiers] describes the complexity of vector::insert:
@@ -923,7 +951,7 @@ inserting at the end of the vector, and then usingI looked to see if deque had a similar problem, and was surprised to find that deque places no requirement on the -complexity of inserting multiple elements (23.2.1.3 [lib.deque.modifiers], +complexity of inserting multiple elements (23.2.1.3 [lib.deque.modifiers], paragraph 3):
@@ -960,15 +988,14 @@ complicated than a while loop whose body is a single-element insert.]-
254. Exception types in clause 19 are constructed from std::string -
Section: 19.1 [lib.std.exceptions] Status: Open Submitter: Dave Abrahams Date: 01 Aug 2000
+Section: 19.1 [lib.std.exceptions] Status: Open Submitter: Dave Abrahams Date: 01 Aug 2000
Many of the standard exception types which implementations are required to throw are constructed with a const std::string& parameter. For example:
-- 19.1.5 Class out_of_range [lib.out.of.range] +19.1.5 Class out_of_range [lib.out.of.range] namespace std { class out_of_range : public logic_error { public: @@ -1050,7 +1077,7 @@ copy constructor is potentially invoked during stack unwinding.The copy constructor is a more serious problem, becuase failure during stack unwinding invokes terminate. The copy -constructor must be nothrow. Curaçao: Howard thinks this +constructor must be nothrow. Curaçao: Howard thinks this requirement is already present.
The fundamental problem is that it's difficult to get the nothrow @@ -1061,8 +1088,8 @@ include:
- Limit the size of a string that exception objects are required to -throw: change the postconditions of 19.1.2 [lib.domain.error] paragraph 3 -and 19.1.6 [lib.runtime.error] paragraph 3 to something like this: +throw: change the postconditions of 19.1.2 [lib.domain.error] paragraph 3 +and 19.1.6 [lib.runtime.error] paragraph 3 to something like this: "strncmp(what(), what_arg._str(), N) == 0, where N is an implementation defined constant no smaller than 256".
- Allow the const string& constructor to throw, but not the @@ -1102,9 +1129,9 @@ intended here is that the copy constructors can't fail.
[Pre-Sydney: reopened at the request of Howard Hinnant.]
-258. Missing allocator requirement
Section: 20.1.5 [lib.allocator.requirements] Status: Open Submitter: Matt Austern Date: 22 Aug 2000
+258. Missing allocator requirement
Section: 20.1.5 [lib.allocator.requirements] Status: Open Submitter: Matt Austern Date: 22 Aug 2000
-From lib-7752: +>From lib-7752:
@@ -1171,10 +1198,10 @@ the second line from the bottom in table 32 already implies the desired property. This issue should be considered in light of other issues related to allocator instances.]
-280. Comparison of reverse_iterator to const reverse_iterator
Section: 24.4.1 [lib.reverse.iterators] Status: Open Submitter: Steve Cleary Date: 27 Nov 2000
+280. Comparison of reverse_iterator to const reverse_iterator
Section: 24.4.1 [lib.reverse.iterators] Status: Open Submitter: Steve Cleary Date: 27 Nov 2000
This came from an email from Steve Cleary to Fergus in reference to -issue 179. The library working group briefly discussed +issue 179. The library working group briefly discussed this in Toronto and believed it should be a separate issue. There was also some reservations about whether this was a worthwhile problem to fix. @@ -1195,10 +1222,9 @@ that, I don't see how any user code could break."
Proposed resolution:
-Section: 24.4.1.1 [lib.reverse.iterator] +Section: 24.4.1.1 [lib.reverse.iterator] add/change the following declarations:
-- A) Add a templated assignment operator, after the same manner +A) Add a templated assignment operator, after the same manner as the templated copy constructor, i.e.: template < class U > @@ -1222,7 +1248,7 @@ add/change the following declarations:Also make the addition/changes for these signatures in -24.4.1.3 [lib.reverse.iter.ops]. +24.4.1.3 [lib.reverse.iter.ops].
[ @@ -1234,7 +1260,7 @@ desirable to provide this feature in a different way. ]
-290. Requirements to for_each and its function object
Section: 25.1.1 [lib.alg.foreach] Status: Open Submitter: Angelika Langer Date: 03 Jan 2001
+290. Requirements to for_each and its function object
Section: 25.1.1 [lib.alg.foreach] Status: Open Submitter: Angelika Langer Date: 03 Jan 2001
The specification of the for_each algorithm does not have a "Requires" section, which means that there are no restrictions imposed on the function object whatsoever. In essence it @@ -1262,7 +1288,7 @@ algorithm does not say so.
Proposed resolution:
Add a "Requires" section to section 25.1.1 similar to those proposed for transform and the numeric algorithms (see issue -242): +242):
@@ -1278,14 +1304,13 @@ blanket statement in Clause 25, not just a special requirement for ]
-294. User defined macros and standard headers
Section: 17.4.3.1.1 [lib.macro.names] Status: Open Submitter: James Kanze Date: 11 Jan 2001
-Paragraph 2 of 17.4.3.1.1 [lib.macro.names] reads: "A +
294. User defined macros and standard headers
Section: 17.4.3.1.1 [lib.macro.names] Status: Open Submitter: James Kanze Date: 11 Jan 2001
+Paragraph 2 of 17.4.3.1.1 [lib.macro.names] reads: "A translation unit that includes a header shall not contain any macros that define names declared in that header." As I read this, it would mean that the following program is legal:
-- #define npos 3.14 +#define npos 3.14 #include <sstream>@@ -1296,30 +1321,30 @@ which <sstream> didn't include <string>.I think that this phrase was probably formulated before it was decided that a standard header may freely include other standard headers. The phrase would be perfectly appropriate for C, for -example. In light of 17.4.4.1 [lib.res.on.headers] paragraph 1, however, +example. In light of 17.4.4.1 [lib.res.on.headers] paragraph 1, however, it isn't stringent enough.
Proposed resolution:
-In paragraph 2 of 17.4.3.1.1 [lib.macro.names], change "A +
In paragraph 2 of 17.4.3.1.1 [lib.macro.names], change "A translation unit that includes a header shall not contain any macros that define names declared in that header." to "A translation unit that includes a header shall not contain any macros that define names declared in any standard header."
[Copenhagen: the general idea is clearly correct, but there is -concern about making sure that the two paragraphs in 17.4.3.1.1 [lib.macro.names] remain consistent. Nathan will provide new +concern about making sure that the two paragraphs in 17.4.3.1.1 [lib.macro.names] remain consistent. Nathan will provide new wording.]
-299. Incorrect return types for iterator dereference
Section: 24.1.4 [lib.bidirectional.iterators], 24.1.5 [lib.random.access.iterators] Status: Open Submitter: John Potter Date: 22 Jan 2001
+299. Incorrect return types for iterator dereference
Section: 24.1.4 [lib.bidirectional.iterators], 24.1.5 [lib.random.access.iterators] Status: Open Submitter: John Potter Date: 22 Jan 2001
-In section 24.1.4 [lib.bidirectional.iterators], +In section 24.1.4 [lib.bidirectional.iterators], Table 75 gives the return type of *r-- as convertible to T. This is not consistent with Table 74 which gives the return type of *r++ as T&. *r++ = t is valid while *r-- = t is invalid.
-In section 24.1.5 [lib.random.access.iterators], +In section 24.1.5 [lib.random.access.iterators], Table 76 gives the return type of a[n] as convertible to T. This is not consistent with the semantics of *(a + n) which returns T& by Table 74. *(a + n) = t is valid while a[n] = t is invalid. @@ -1410,11 +1435,11 @@ with a return type of convertible to T and operational semantics of
-309. Does sentry catch exceptions?
Section: 27.6 [lib.iostream.format] Status: Open Submitter: Martin Sebor Date: 19 Mar 2001
+309. Does sentry catch exceptions?
Section: 27.6 [lib.iostream.format] Status: Open Submitter: Martin Sebor Date: 19 Mar 2001
The descriptions of the constructors of basic_istream<>::sentry -(27.6.1.1.2 [lib.istream::sentry]) and basic_ostream<>::sentry -(27.6.2.3 [lib.ostream::sentry]) do not explain what the functions do in +(27.6.1.1.2 [lib.istream::sentry]) and basic_ostream<>::sentry +(27.6.2.3 [lib.ostream::sentry]) do not explain what the functions do in case an exception is thrown while they execute. Some current implementations allow all exceptions to propagate, others catch them and set ios_base::badbit instead, still others catch some but let @@ -1425,16 +1450,16 @@ others propagate. The text also mentions that the functions may call setstate(failbit) (without actually saying on what object, but presumably the stream argument is meant). That may have been fine for -basic_istream<>::sentry prior to issue 195, since +basic_istream<>::sentry prior to issue 195, since the function performs an input operation which may fail. However, -issue 195 amends 27.6.1.1.2 [lib.istream::sentry], p2 to +issue 195 amends 27.6.1.1.2 [lib.istream::sentry], p2 to clarify that the function should actually call setstate(failbit | eofbit), so the sentence in p3 is redundant or even somewhat contradictory.
-The same sentence that appears in 27.6.2.3 [lib.ostream::sentry], p3 +The same sentence that appears in 27.6.2.3 [lib.ostream::sentry], p3 doesn't seem to be very meaningful for basic_istream<>::sentry which performs no input. It is actually rather misleading since it would appear to guide library implementers to calling @@ -1526,8 +1551,7 @@ badbit is also set in exceptions().
[1] Extractor that catches exceptions thrown from sentry:
--struct S { long i; }; +struct S { long i; }; istream& operator>> (istream &strm, S &s) { @@ -1563,8 +1587,7 @@ istream& operator>> (istream &strm, S &s)[2] Extractor that propagates exceptions thrown from sentry:
--istream& operator>> (istream &strm, S &s) +istream& operator>> (istream &strm, S &s) { istream::sentry guard (strm, false); if (guard) { @@ -1602,8 +1625,7 @@ result of a call to strm.clear().--istream& operator>> (istream &strm, S &s) +istream& operator>> (istream &strm, S &s) { const ios::iostate state = strm.rdstate (); const ios::iostate except = strm.exceptions (); @@ -1642,9 +1664,9 @@ istream& operator>> (istream &strm, S &s)Proposed resolution:
-Remove the last sentence of 27.6.1.1.2 [lib.istream::sentry] p5 (but not +
Remove the last sentence of 27.6.1.1.2 [lib.istream::sentry] p5 (but not the footnote, which should be moved to the preceding sentence).
-Remove the last sentence of 27.6.2.3 [lib.ostream::sentry] p3 (but not +
Remove the last sentence of 27.6.2.3 [lib.ostream::sentry] p3 (but not the footnote, which should be moved to the preceding sentence).
Rationale:
The LWG feels that no clarification of EH policy is necessary: the @@ -1652,11 +1674,11 @@ istream& operator>> (istream &strm, S &s) performs, and about which of those operations can throw. However, the sentence at the end should be removed because it's redundant.
-342. seek and eofbit
Section: 27.6.1.3 [lib.istream.unformatted] Status: Open Submitter: Howard Hinnant Date: 09 Oct 201
+342. seek and eofbit
Section: 27.6.1.3 [lib.istream.unformatted] Status: Open Submitter: Howard Hinnant Date: 09 Oct 201
I think we have a defect.
-According to lwg issue 60 which is now a dr, the -description of seekg in 27.6.1.3 [lib.istream.unformatted] paragraph 38 now looks +
According to lwg issue 60 which is now a dr, the +description of seekg in 27.6.1.3 [lib.istream.unformatted] paragraph 38 now looks like:
@@ -1664,10 +1686,10 @@ Behaves as an unformatted input function (as described in 27.6.1.3, paragraph 1), except that it does not count the number of characters extracted and does not affect the value returned by subsequent calls to gcount(). After constructing a sentry object, if fail() != true, -executes rdbuf()>pubseekpos( pos). +executes rdbuf()>pubseekpos( pos).-And according to lwg issue 243 which is also now a dr, +
And according to lwg issue 243 which is also now a dr, 27.6.1.3, paragraph 1 looks like:
@@ -1732,12 +1754,11 @@ examined by the user to determine why something failed. and propose a resolution.]
-356. Meaning of ctype_base::mask enumerators
Section: 22.2.1 [lib.category.ctype] Status: Open Submitter: Matt Austern Date: 23 Jan 2002
+356. Meaning of ctype_base::mask enumerators
Section: 22.2.1 [lib.category.ctype] Status: Open Submitter: Matt Austern Date: 23 Jan 2002
What should the following program print?
-- #include <locale> +#include <locale> #include <iostream> class my_ctype : public std::ctype<char> @@ -1777,7 +1798,7 @@ The above program assumes that ctype_base::mask enumerators like space and print are disjoint, and that the way to say that a character is both a space and a printing character is to or those two enumerators together. This is suggested by the "exposition -only" values in 22.2.1 [lib.category.ctype], but it is nowhere specified in +only" values in 22.2.1 [lib.category.ctype], but it is nowhere specified in normative text. An alternative interpretation is that the more specific categories subsume the less specific. The above program gives the results it does on the Microsoft compiler because, on that @@ -1802,8 +1823,8 @@ lib-9224, lib-9226, lib-9229, lib-9270, lib-9272, lib-9273, lib-9274, lib-9277, lib-9279. -Issue 339 is related, but not identical. The -proposed resolution if issue 339 says that +
Issue 339 is related, but not identical. The +proposed resolution if issue 339 says that ctype_base::mask must be a bitmask type. It does not say that the ctype_base::mask elements are bitmask elements, so it doesn't directly affect this issue.
@@ -1813,8 +1834,7 @@ that C99 compatibility essentially requires what we're calling option 1 below.--I think the C99 standard is clear, that isspace -> !isalpha. +I think the C99 standard is clear, that isspace -> !isalpha. -------- #include <locale> @@ -1876,16 +1896,15 @@ option 1 is required for C99 compatibility. ]
-362. bind1st/bind2nd type safety
Section: 20.3.6.2 [lib.bind.1st] Status: Open Submitter: Andrew Demkin Date: 26 Apr 2002
+362. bind1st/bind2nd type safety
Section: 20.3.6.2 [lib.bind.1st] Status: Open Submitter: Andrew Demkin Date: 26 Apr 2002
-The definition of bind1st() (20.3.6.2 [lib.bind.1st]) can result in +The definition of bind1st() (20.3.6.2 [lib.bind.1st]) can result in the construction of an unsafe binding between incompatible pointer types. For example, given a function whose first parameter type is 'pointer to T', it's possible without error to bind an argument of type 'pointer to U' when U does not derive from T:
-- foo(T*, int); +foo(T*, int); struct T {}; struct U {}; @@ -1903,25 +1922,23 @@ The definition of bind1st() includes a functional-style conversion to map its argument to the expected argument type of the bound function (see below): -- typename Operation::first_argument_type(x) +typename Operation::first_argument_type(x)-A functional-style conversion (5.2.3 [expr.type.conv]) is defined to be -semantically equivalent to an explicit cast expression (5.4 [expr.cast]), which may (according to 5.4, paragraph 5) be interpreted +A functional-style conversion (5.2.3 [expr.type.conv]) is defined to be +semantically equivalent to an explicit cast expression (5.4 [expr.cast]), which may (according to 5.4, paragraph 5) be interpreted as a reinterpret_cast, thus masking the error.
-The problem and proposed change also apply to 20.3.6.4 [lib.bind.2nd].
+The problem and proposed change also apply to 20.3.6.4 [lib.bind.2nd].
Proposed resolution:
The simplest and most localized change to prevent such errors is to require bind1st() use a static_cast expression rather than the functional-style conversion; that is, have bind1st() return:
-- binder1st<Operation>( op, +binder1st<Operation>( op, static_cast<typename Operation::first_argument_type>(x)).@@ -1945,7 +1962,7 @@ programming. all. Jeremy will check with the original author of this part of the Standard and will see what the original intent was.]
-366. Excessive const-qualification
Section: 27 [lib.input.output] Status: Open Submitter: Walter Brown, Marc Paterno Date: 10 May 2002
+366. Excessive const-qualification
Section: 27 [lib.input.output] Status: Open Submitter: Walter Brown, Marc Paterno Date: 10 May 2002
The following member functions are declared const, yet return non-const pointers. We believe they are should be changed, because they allow code @@ -1964,112 +1981,92 @@ those terms, does not appear in the standard.]
Proposed resolution:
In 27.4.4 and 27.4.4.2
Replace
-- basic_ostream<charT,traits>* tie() const; +basic_ostream<charT,traits>* tie() const;with
-- basic_ostream<charT,traits>* tie(); +basic_ostream<charT,traits>* tie(); const basic_ostream<charT,traits>* tie() const;and replace
-- basic_streambuf<charT,traits>* rdbuf() const; +basic_streambuf<charT,traits>* rdbuf() const;with
-- basic_streambuf<charT,traits>* rdbuf(); +basic_streambuf<charT,traits>* rdbuf(); const basic_streambuf<charT,traits>* rdbuf() const;In 27.5.2 and 27.5.2.3.1
Replace
-- char_type* eback() const; +char_type* eback() const;with
-- char_type* eback(); +char_type* eback(); const char_type* eback() const;Replace
-- char_type gptr() const; +char_type gptr() const;with
-- char_type* gptr(); +char_type* gptr(); const char_type* gptr() const;Replace
-- char_type* egptr() const; +char_type* egptr() const;with
-- char_type* egptr(); +char_type* egptr(); const char_type* egptr() const;In 27.5.2 and 27.5.2.3.2
Replace
-- char_type* pbase() const; +char_type* pbase() const;with
-- char_type* pbase(); +char_type* pbase(); const char_type* pbase() const;Replace
-- char_type* pptr() const; +char_type* pptr() const;with
-- char_type* pptr(); +char_type* pptr(); const char_type* pptr() const;Replace
-- char_type* epptr() const; +char_type* epptr() const;with
-- char_type* epptr(); +char_type* epptr(); const char_type* epptr() const;In 27.7.2, 27.7.2.2, 27.7.3 27.7.3.2, 27.7.4, and 27.7.6
Replace
-- basic_stringbuf<charT,traits,Allocator>* rdbuf() const; +basic_stringbuf<charT,traits,Allocator>* rdbuf() const;with
-- basic_stringbuf<charT,traits,Allocator>* rdbuf(); +basic_stringbuf<charT,traits,Allocator>* rdbuf(); const basic_stringbuf<charT,traits,Allocator>* rdbuf() const;In 27.8.1.5, 27.8.1.7, 27.8.1.8, 27.8.1.10, 27.8.1.11, and 27.8.1.13
Replace
-- basic_filebuf<charT,traits>* rdbuf() const; +basic_filebuf<charT,traits>* rdbuf() const;with
-- basic_filebuf<charT,traits>* rdbuf(); +basic_filebuf<charT,traits>* rdbuf(); const basic_filebuf<charT,traits>* rdbuf() const;
-368. basic_string::replace has two "Throws" paragraphs
Section: 21.3.5.6 [lib.string::replace] Status: Open Submitter: Beman Dawes Date: 3 Jun 2002
+368. basic_string::replace has two "Throws" paragraphs
Section: 21.3.5.6 [lib.string::replace] Status: Open Submitter: Beman Dawes Date: 3 Jun 2002
-21.3.5.6 [lib.string::replace] basic_string::replace, second +21.3.5.6 [lib.string::replace] basic_string::replace, second signature, given in paragraph 1, has two "Throws" paragraphs (3 and 5).
@@ -2085,7 +2082,7 @@ part of the "Effects" paragraph. Someone who understands string replace well needs to work on this.]
-369. io stream objects and static ctors
Section: 27.3 [lib.iostream.objects] Status: Review Submitter: Ruslan Abdikeev Date: 8 Jul 2002
+369. io stream objects and static ctors
Section: 27.3 [lib.iostream.objects] Status: Open Submitter: Ruslan Abdikeev Date: 8 Jul 2002
Is it safe to use standard iostream objects from constructors of static objects? Are standard iostream objects constructed and are @@ -2150,6 +2147,15 @@ an appropriate class for doing the trick, I failed to found a mention of an _instance_ of ios_base::Init in Standard.
Proposed resolution:
+ +[Redmond: This still isn't precise enough. We need to give + users some guarantees, i.e. "if you do X, then you are guaranteed + that you will see behavior Y." We should guarantee that stream + objects are constructed before a static constructor if (1) + <iostream> is #included before the relevant static object; or + (2) the user explicitly constructs an ios_base::Init object before + calling that constuctor.]
+Add to [lib.iostream.objects], p2, immediately before the last sentence of the paragraph, the following two sentences:
@@ -2202,13 +2208,12 @@ and destructors for static objects" used in Footnote 265 since the former includes other functions besides constructors and destructors, including the following example: -- int foo () { return (std::cout << "foo()\n").rdstate (); } +int foo () { return (std::cout << "foo()\n").rdstate (); } int i = foo (); int main () { return i; }
-371. Stability of multiset and multimap member functions
Section: 23.1 [lib.container.requirements] Status: Open Submitter: Frank Compagner Date: 20 Jul 2002
+371. Stability of multiset and multimap member functions
Section: 23.1 [lib.container.requirements] Status: Open Submitter: Frank Compagner Date: 20 Jul 2002
The requirements for multiset and multimap containers (23.1 [lib.containers.requirements], 23.1.2 [lib.associative.reqmnts], @@ -2225,8 +2230,7 @@ following 'idiom' that removes elements based on a certain predicate function.
-- multimap<int, int> m; +multimap<int, int> m; multimap<int, int>::iterator i = m.begin(); while (i != m.end()) { if (pred(i)) @@ -2261,7 +2265,7 @@ be hard to track down by users. This would also make the need for an erase_if() member function that much greater. -This issue is somewhat related to LWG issue 130.
+This issue is somewhat related to LWG issue 130.
[Santa Cruz: More people need to look at this. Much user code may assume stability. On the other hand, it seems drastic to add a @@ -2269,9 +2273,9 @@ erase_if() member function that much greater.
Proposed resolution:
-376. basic_streambuf semantics
Section: 27.7.1.3 [lib.stringbuf.virtuals] Status: Open Submitter: Ray Lischner Date: 14 Aug 2002
+376. basic_streambuf semantics
Section: 27.7.1.3 [lib.stringbuf.virtuals] Status: Open Submitter: Ray Lischner Date: 14 Aug 2002
-In Section 27.7.1.3 [lib.stringbuf.virtuals], Table 90, the implication is that +In Section 27.7.1.3 [lib.stringbuf.virtuals], Table 90, the implication is that the four conditions should be mutually exclusive, but they are not. The first two cases, as written, are subcases of the third. I think it would be clearer if the conditions were rewritten as follows: @@ -2309,46 +2313,7 @@ implementations before we decide on a solution.]
Proposed resolution:
-378. locale immutability and locale::operator=()
Section: 22.1.1 [lib.locale] Status: Review Submitter: Martin Sebor Date: 6 Sep 2002
--I think there is a problem with 22.1.1, p6 which says that -
-- -6- An instance of locale is immutable; once a facet reference - is obtained from it, that reference remains usable as long - as the locale value itself exists. ---and 22.1.1.2, p4: -
-- const locale& operator=(const locale& other) throw(); - - -4- Effects: Creates a copy of other, replacing the current value. ---How can a reference to a facet obtained from a locale object remain -valid after an assignment that clearly must replace all the facets -in the locale object? Imagine a program such as this -
-- std::locale loc ("de_DE"); - const std::ctype<char> &r0 = std::use_facet<std::ctype<char> >(loc); - loc = std::locale ("en_US"); - const std::ctype<char> &r1 = std::use_facet<std::ctype<char> >(loc); ---Is r0 really supposed to be preserved and destroyed only when loc goes -out of scope? -
-Proposed resolution:
-[Summer '04 mid-meeting mailing: Martin and Dietmar believe this - is a duplicate of issue 31 and recommend that it be - closed. -]
- -
-382. codecvt do_in/out result
Section: 22.2.1.5 [lib.locale.codecvt] Status: Open Submitter: Martin Sebor Date: 30 Aug 2002
+382. codecvt do_in/out result
Section: 22.2.1.5 [lib.locale.codecvt] Status: Open Submitter: Martin Sebor Date: 30 Aug 2002
It seems that the descriptions of codecvt do_in() and do_out() leave sufficient room for interpretation so that two implementations of @@ -2373,7 +2338,7 @@ the following seems less than adequately specified:
- - 22.2.1.5.2 [lib.locale.codecvt.virtuals], p2 says this about the effects of the + 22.2.1.5.2 [lib.locale.codecvt.virtuals], p2 says this about the effects of the function: ...Stops if it encounters a character it cannot convert... This assumes that there *is* a character to convert. What happens when there is a sequence that doesn't form a @@ -2406,7 +2371,7 @@ the following seems less than adequately specified:
-Finally, the conditions described at the end of 22.2.1.5.2 [lib.locale.codecvt.virtuals], p4 don't seem to be possible: +Finally, the conditions described at the end of 22.2.1.5.2 [lib.locale.codecvt.virtuals], p4 don't seem to be possible:
"A return value of partial, if (from_next == from_end), @@ -2420,7 +2385,7 @@ If the value is partial, it's not clear to me that (from_next ==from_end) could ever hold if there isn't enough room in the destination buffer. In order for (from_next==from_end) to hold, all characters in that range must have been successfully -converted (according to 22.2.1.5.2 [lib.locale.codecvt.virtuals], p2) and since there are no +converted (according to 22.2.1.5.2 [lib.locale.codecvt.virtuals], p2) and since there are no further source characters to convert, no more room in the destination buffer can be needed. @@ -2450,11 +2415,10 @@ To address these issues, I propose that paragraphs 2, 3, and 4 be rewritten as follows. The proposal incorporates the accepted resolution of lwg issue 19. ---2- Effects: Converts characters in the range of source elements +-2- Effects: Converts characters in the range of source elements [from, from_end), placing the results in sequential positions - starting at destination to. Converts no more than (from_end from) - source elements, and stores no more than (to_limit to) + starting at destination to. Converts no more than (from_end from) + source elements, and stores no more than (to_limit to) destination elements. Stops if it encounters a sequence of source elements it cannot @@ -2518,9 +2482,9 @@ written with the assumption of 1->N conversion in mind, not M->N. Bill, Howard, and Martin will provide new wording. ]
-384. equal_range has unimplementable runtime complexity
Section: 25.3.3.3 [lib.equal.range] Status: Open Submitter: Hans Bos Date: 18 Oct 2002
+384. equal_range has unimplementable runtime complexity
Section: 25.3.3.3 [lib.equal.range] Status: Open Submitter: Hans Bos Date: 18 Oct 2002
-Section 25.3.3.3 [lib.equal.range] +Section 25.3.3.3 [lib.equal.range] states that at most 2 * log(last - first) + 1 comparisons are allowed for equal_range.
@@ -2528,8 +2492,7 @@ comparisons are allowed for equal_range.It is not possible to implement equal_range with these constraints.
In a range of one element as in:
-- int x = 1; +int x = 1; equal_range(&x, &x + 1, 1)@@ -2539,8 +2502,7 @@ comparisons are allowed for equal_range.I have checked a few libraries and they all use the same (nonconforming) algorithm for equal_range that has a complexity of
-- 2* log(distance(first, last)) + 2. +2* log(distance(first, last)) + 2.I guess this is the algorithm that the standard assumes for equal_range.
@@ -2567,11 +2529,11 @@ other questions matter.)]Proposed resolution:
-385. Does call by value imply the CopyConstructible requirement?
Section: 17 [lib.library] Status: Open Submitter: Matt Austern Date: 23 Oct 2002
+385. Does call by value imply the CopyConstructible requirement?
Section: 17 [lib.library] Status: Open Submitter: Matt Austern Date: 23 Oct 2002
Many function templates have parameters that are passed by value; a typical example is find_if's pred parameter in -25.1.2 [lib.alg.find]. Are the corresponding template parameters +25.1.2 [lib.alg.find]. Are the corresponding template parameters (Predicate in this case) implicitly required to be CopyConstructible, or does that need to be spelled out explicitly?
@@ -2590,8 +2552,8 @@ my_predicate& is not CopyConstructible.The scope of this problem, if it is a problem, is unknown. Function -object arguments to generic algorithms in clauses 25 [lib.algorithms] -and 26 [lib.numerics] are obvious examples. A review of the whole +object arguments to generic algorithms in clauses 25 [lib.algorithms] +and 26 [lib.numerics] are obvious examples. A review of the whole library is necessary.
Proposed resolution:
@@ -2603,8 +2565,8 @@ into references? References aren't copy constructible, so this should not be allowed. ]
-386. Reverse iterator's operator[] has impossible return type
Section: 24.4.1.3.11 [lib.reverse.iter.opindex] Status: Review Submitter: Matt Austern Date: 23 Oct 2002
-In 24.4.1.3.11 [lib.reverse.iter.opindex], reverse_iterator<>::operator[] +
386. Reverse iterator's operator[] has impossible return type
Section: 24.4.1.3.11 [lib.reverse.iter.opindex] Status: Ready Submitter: Matt Austern Date: 23 Oct 2002
+In 24.4.1.3.11 [lib.reverse.iter.opindex], reverse_iterator<>::operator[] is specified as having a return type of reverse_iterator::reference, which is the same as iterator_traits<Iterator>::reference. (Where Iterator is the underlying iterator type.)
@@ -2616,7 +2578,7 @@ which is the same as iterator_traits<Iterator>::reference. to Iterator's value type. The return type specified for reverse_iterator's operator[] would thus appear to be impossible. -With the resolution of issue 299, the type of +
With the resolution of issue 299, the type of a[n] will continue to be required (for random access iterators) to be convertible to the value type, and also a[n] = t will be a valid expression. Implementations of @@ -2628,19 +2590,17 @@ which is the same as iterator_traits<Iterator>::reference.
Proposed resolution:
-In 24.4.1.2 [lib.reverse.iter.requirements] change:
+In 24.4.1.2 [lib.reverse.iter.requirements] change:
--reference operator[](difference_type n) const; +reference operator[](difference_type n) const;to:
-@@ -2656,7 +2616,7 @@ Comments from Dave Abrahams: IMO we should resolve 386 by just saying readable and writable, which is about as good as we can do. ]-implementation defined operator[](difference_type n) const; // see lib.random.access.iterators +unspecified operator[](difference_type n) const; // see lib.random.access.iterators
-387. std::complex over-encapsulated
Section: 26.2 [lib.complex.numbers] Status: Open Submitter: Gabriel Dos Reis Date: 8 Nov 2002
+387. std::complex over-encapsulated
Section: 26.2 [lib.complex.numbers] Status: Open Submitter: Gabriel Dos Reis Date: 8 Nov 2002
The absence of explicit description of std::complex<T> layout makes it imposible to reuse existing software developed in traditional @@ -2669,8 +2629,7 @@ severe pessimizations. For example, the only way to change, independently, the real and imaginary parts is to write something like
--complex<T> z; +complex<T> z; // ... // set the real part to r z = complex<T>(r, z.imag()); @@ -2689,7 +2648,7 @@ of std::complex<> is not justified.Proposed resolution:
-Add the following requirements to 26.2 [lib.complex.numbers] as 26.2/4:
+Add the following requirements to 26.2 [lib.complex.numbers] as 26.2/4:
If z is an lvalue expression of type cv std::complex<T> then
@@ -2716,40 +2675,34 @@ imaginary part of a[i].In the header synopsis in 26.2.1 [lib.complex.synopsis], replace
-- template<class T> T real(const complex<T>&); +In the header synopsis in 26.2.1 [lib.complex.synopsis], replace
+template<class T> T real(const complex<T>&); template<class T> T imag(const complex<T>&);with
-- template<class T> const T& real(const complex<T>&); +template<class T> const T& real(const complex<T>&); template<class T> T& real( complex<T>&); template<class T> const T& imag(const complex<T>&); template<class T> T& imag( complex<T>&);-In 26.2.7 [lib.complex.value.ops] paragraph 1, change
-- template<class T> T real(const complex<T>&); +In 26.2.7 [lib.complex.value.ops] paragraph 1, change
+template<class T> T real(const complex<T>&);to
-- template<class T> const T& real(const complex<T>&); +template<class T> const T& real(const complex<T>&); template<class T> T& real( complex<T>&);and change the Returns clause to "Returns: The real part of x
. -In 26.2.7 [lib.complex.value.ops] paragraph 2, change
-- template<class T> T imag(const complex<T>&); +In 26.2.7 [lib.complex.value.ops] paragraph 2, change
+template<class T> T imag(const complex<T>&);to
-- template<class T> const T& imag(const complex<T>&); +template<class T> const T& imag(const complex<T>&); template<class T> T& imag( complex<T>&);and change the Returns clause to "Returns: The imaginary @@ -2773,7 +2726,7 @@ part of x
. justification for this change even without other considerations. All existing implementations already have the layout proposed here.
-394. behavior of formatted output on failure
Section: 27.6.2.5.1 [lib.ostream.formatted.reqmts] Status: Open Submitter: Martin Sebor Date: 27 Dec 2002
+394. behavior of formatted output on failure
Section: 27.6.2.5.1 [lib.ostream.formatted.reqmts] Status: Open Submitter: Martin Sebor Date: 27 Dec 2002
There is a contradiction in Formatted output about what bit is supposed to be set if the formatting fails. On sentence says it's @@ -2782,11 +2735,10 @@ badbit and another that it's failbit.
27.6.2.5.1, p1 says in the Common Requirements on Formatted output functions: -
- ... If the generation fails, then the formatted output function +... If the generation fails, then the formatted output function does setstate(ios::failbit), which might throw an exception.- +27.6.2.5.2, p1 goes on to say this about Arithmetic Inserters:
@@ -2795,15 +2747,14 @@ functions: following code fragment:-
- bool failed = +bool failed = use_facet<num_put<charT,ostreambuf_iterator<charT,traits> > > (getloc()).put(*this, *this, fill(), val). failed(); ... If failed is true then does setstate(badbit) ...- +The original intent of the text, according to Jerry Schwarz (see c++std-lib-10500), is captured in the following paragraph: @@ -2870,7 +2821,7 @@ functions should be changed as proposed below.
Rationale:
-396. what are characters zero and one
Section: 23.3.5.1 [lib.bitset.cons] Status: Open Submitter: Martin Sebor Date: 5 Jan 2003
+396. what are characters zero and one
Section: 23.3.5.1 [lib.bitset.cons] Status: Open Submitter: Martin Sebor Date: 5 Jan 2003
23.3.5.1, p6 [lib.bitset.cons] talks about a generic character having the value of 0 or 1 but there is no definition of what @@ -2883,14 +2834,12 @@ p33, looks like a defect remotely related to DR 303.
http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-defects.html#303
--23.3.5.1: +23.3.5.1: -6- An element of the constructed string has value zero if the corresponding character in str, beginning at position pos, is 0. Otherwise, the element has the value one.--23.3.5.2: +23.3.5.2: -33- Effects: Constructs a string object of the appropriate type and initializes it to a string of length N characters. Each character is determined by the value of its @@ -2906,9 +2855,8 @@ is a bitset, not a string.Proposed resolution:
Change the constructor's function declaration immediately before -23.3.5.1 [lib.bitset.cons] p3 to:
-- template <class charT, class traits, class Allocator> +23.3.5.1 [lib.bitset.cons] p3 to: +template <class charT, class traits, class Allocator> explicit bitset(const basic_string<charT, traits, Allocator>& str, typename basic_string<charT, traits, Allocator>::size_type pos = 0, @@ -2916,7 +2864,7 @@ is a bitset, not a string. basic_string<charT, traits, Allocator>::npos, charT zero = charT('0'), charT one = charT('1'))-Change the first two sentences of 23.3.5.1 [lib.bitset.cons] p6 to: "An +
Change the first two sentences of 23.3.5.1 [lib.bitset.cons] p6 to: "An element of the constructed string has value 0 if the corresponding character in str, beginning at position pos, is zero. Otherwise, the element has the value 1.
@@ -2929,19 +2877,17 @@ is zero. Otherwise, the element has the value 1.Change the declaration of the to_string member function - immediately before 23.3.5.2 [lib.bitset.members] p33 to:
-- template <class charT, class traits, class Allocator> + immediately before 23.3.5.2 [lib.bitset.members] p33 to: +template <class charT, class traits, class Allocator> basic_string<charT, traits, Allocator> to_string(charT zero = charT('0'), charT one = charT('1')) const;-Change the last sentence of 23.3.5.2 [lib.bitset.members] p33 to: "Bit +
Change the last sentence of 23.3.5.2 [lib.bitset.members] p33 to: "Bit value 0 becomes the character zero, bit value 1 becomes the character one.
-Change 23.3.5.3 [lib.bitset.operators] p8 to:
+Change 23.3.5.3 [lib.bitset.operators] p8 to:
Returns:
-- os << x.template to_string<charT,traits,allocator<charT> >( +os << x.template to_string<charT,traits,allocator<charT> >( use_facet<ctype<charT> >(os.getloc()).widen('0'), use_facet<ctype<charT> >(os.getloc()).widen('1'));@@ -2955,25 +2901,23 @@ is zero. Otherwise, the element has the value 1. resolution allows those users who care about this issue to get it right.We fix the inserter to use the new arguments. Note that we already - fixed the analogous problem with the extractor in issue 303.
+ fixed the analogous problem with the extractor in issue 303.
-397. ostream::sentry dtor throws exceptions
Section: 27.6.2.3 [lib.ostream::sentry] Status: Open Submitter: Martin Sebor Date: 5 Jan 2003
+397. ostream::sentry dtor throws exceptions
Section: 27.6.2.3 [lib.ostream::sentry] Status: Open Submitter: Martin Sebor Date: 5 Jan 2003
17.4.4.8, p3 prohibits library dtors from throwing exceptions.
27.6.2.3, p4 says this about the ostream::sentry dtor:
-- -4- If ((os.flags() & ios_base::unitbuf) && !uncaught_exception()) +-4- If ((os.flags() & ios_base::unitbuf) && !uncaught_exception()) is true, calls os.flush().27.6.2.6, p7 that describes ostream::flush() says:
-- -7- If rdbuf() is not a null pointer, calls rdbuf()->pubsync(). +-7- If rdbuf() is not a null pointer, calls rdbuf()->pubsync(). If that function returns ?-1 calls setstate(badbit) (which may throw ios_base::failure (27.4.4.3)).@@ -2992,7 +2936,7 @@ is the only one that can throw. PJP suggests specifying that sentry::~sentry() should internally catch any exceptions it might cause. ]
-398. effects of end-of-file on unformatted input functions
Section: 27.6.2.3 [lib.ostream::sentry] Status: Open Submitter: Martin Sebor Date: 5 Jan 2003
+398. effects of end-of-file on unformatted input functions
Section: 27.6.2.3 [lib.ostream::sentry] Status: Open Submitter: Martin Sebor Date: 5 Jan 2003
While reviewing unformatted input member functions of istream for their behavior when they encounter end-of-file during input @@ -3007,61 +2951,54 @@ encounter an end-of-file (this is the expected behavior, and also the behavior of all major implementations):
-
- basic_istream<charT, traits>& +basic_istream<charT, traits>& get (char_type*, streamsize, char_type);- +Also sets failbit if it fails to extract any characters.
-
- basic_istream<charT, traits>& +basic_istream<charT, traits>& get (char_type*, streamsize);- +Also sets failbit if it fails to extract any characters.
-
- basic_istream<charT, traits>& +basic_istream<charT, traits>& getline (char_type*, streamsize, char_type);- +Also sets failbit if it fails to extract any characters.
-
- basic_istream<charT, traits>& +basic_istream<charT, traits>& getline (char_type*, streamsize);- +Also sets failbit if it fails to extract any characters.
-
- basic_istream<charT, traits>& +basic_istream<charT, traits>& ignore (int, int_type);- +-
- basic_istream<charT, traits>& +basic_istream<charT, traits>& read (char_type*, streamsize);- +Also sets failbit if it encounters end-of-file.
-
- streamsize readsome (char_type*, streamsize); +streamsize readsome (char_type*, streamsize);- +The following unformated input member functions set failbit but @@ -3072,16 +3009,14 @@ also in conflict with all major implementation which set both eofbit and failbit):
-
- int_type get(); +int_type get();- +-
- basic_istream<charT, traits>& +basic_istream<charT, traits>& get (char_type&);- +These functions only set failbit of they extract no characters, otherwise they don't set any bits, even on failure (I find this @@ -3090,27 +3025,24 @@ conflict with all major implementations which set eofbit whenever they encounter end-of-file):
-
- basic_istream<charT, traits>& +basic_istream<charT, traits>& get (basic_streambuf<charT, traits>&, char_type);- +-
- basic_istream<charT, traits>& +basic_istream<charT, traits>& get (basic_streambuf<charT, traits>&);- +This function sets no bits (all implementations except for STLport and Classic Iostreams set eofbit when they encounter end-of-file):
-
- int_type peek (); +int_type peek ();- +Proposed resolution:
Informally, what we want is a global statement of intent saying that eofbit gets set if we trip across EOF, and then we can take @@ -3119,14 +3051,13 @@ end-of-file): and changing it on an individual basis wouldn't make things better. Dietmar will do this work.
-401. incorrect type casts in table 32 in lib.allocator.requirements
Section: 20.1.5 [lib.allocator.requirements] Status: Open Submitter: Markus Mauhart Date: 27 Feb 2003
+401. incorrect type casts in table 32 in lib.allocator.requirements
Section: 20.1.5 [lib.allocator.requirements] Status: Open Submitter: Markus Mauhart Date: 27 Feb 2003
-I think that in par2 of 20.1.5 [lib.allocator.requirements] the last two +I think that in par2 of 20.1.5 [lib.allocator.requirements] the last two lines of table 32 contain two incorrect type casts. The lines are ...
-- a.construct(p,t) Effect: new((void*)p) T(t) +a.construct(p,t) Effect: new((void*)p) T(t) a.destroy(p) Effect: ((T*)p)?->~T()@@ -3135,8 +3066,7 @@ lines of table 32 contain two incorrect type casts. The lines are ... from table 31: -- alloc<T> a ;// an allocator for T +alloc<T> a ;// an allocator for T alloc<T>::pointer p ;// random access iterator // (may be different from T*) alloc<T>::reference r = *p;// T& @@ -3160,7 +3090,7 @@ current requirement (being a random access iterator).Note: Actually I would prefer to replace "((T*)p)?->dtor_name" with "p?->dtor_name", but AFAICS this is not possible cause of an omission -in 13.5.6 [over.ref] (for which I have filed another DR on 29.11.2002). +in 13.5.6 [over.ref] (for which I have filed another DR on 29.11.2002).
[Kona: The LWG thinks this is somewhere on the border between @@ -3172,26 +3102,7 @@ in 13.5.6 [over.ref] (for which I have filed a non-default pointer types.]
-405. qsort and POD
Section: 25.4 [lib.alg.c.library] Status: Ready Submitter: Ray Lischner Date: 08 Apr 2003
--Section 25.4 [lib.alg.c.library] describes bsearch and qsort, from the C -standard library. Paragraph 4 does not list any restrictions on qsort, -but it should limit the base parameter to point to POD. Presumably, -qsort sorts the array by copying bytes, which requires POD. -
-Proposed resolution:
--In 25.4 [lib.alg.c.library] paragraph 4, just after the declarations and -before the nonnormative note, add these words: "both of which have the -same behavior as the original declaration. The behavior is undefined -unless the objects in the array pointed to by base are of POD -type." -
- -[Something along these lines is clearly necessary. Matt - provided wording.]
-
-406. vector::insert(s) exception safety
Section: 23.2.4.3 [lib.vector.modifiers] Status: Open Submitter: Dave Abrahams Date: 27 Apr 2003
+406. vector::insert(s) exception safety
Section: 23.2.4.3 [lib.vector.modifiers] Status: Ready Submitter: Dave Abrahams Date: 27 Apr 2003
There is a possible defect in the standard: the standard text was never intended to prevent arbitrary ForwardIterators, whose operations @@ -3202,29 +3113,26 @@ standard appears to impose requirements that aren't met by any existing implementation.
Proposed resolution:
-Replace 23.2.4.2 [lib.vector.capacity] paragraph 1 with:
+Replace 23.2.4.3 [lib.vector.modifiers] paragraph 1 with:
- 1 Notes: Causes reallocation if the new size is greater than the - old capacity. If no reallocation happens, all the iterators and - references before the insertion point remain valid. If an exception - is thrown other than by the copy constructor or assignment operator - of T (or, if first and last satisfy the forward iterator - requirements, an operation on first or last) there are no effects. + 1- Notes: Causes reallocation if the new size is greater than the + old capacity. If no reallocation happens, all the iterators and + references before the insertion point remain valid. If an exception + is thrown other than by the copy constructor or assignment operator + of T or by any InputIterator operation there are no effects.-[Something along these lines is probably a good idea. It's - unclear why we're making a distinction between Input Iterators and - Forward Iterators.]
+[We probably need to say something similar for deque.]
-408. Is vector<reverse_iterator<char*> > forbidden?
Section: 24.1 [lib.iterator.requirements] Status: Open Submitter: Nathan Myers Date: 3 June 2003
+408. Is vector<reverse_iterator<char*> > forbidden?
Section: 24.1 [lib.iterator.requirements] Status: Open Submitter: Nathan Myers Date: 3 June 2003
I've been discussing iterator semantics with Dave Abrahams, and a surprise has popped up. I don't think this has been discussed before.
-24.1 [lib.iterator.requirements] says that the only operation that can be performed on "singular" +24.1 [lib.iterator.requirements] says that the only operation that can be performed on "singular" iterator values is to assign a non-singular value to them. (It doesn't say they can be destroyed, and that's probably a defect.) Some implementations have taken this to imply that there is no need @@ -3274,7 +3182,7 @@ T(), and so copying is defined if the result of T() is copyable.
-Issue 235, which defines reverse_iterator's default +Issue 235, which defines reverse_iterator's default constructor more precisely, has some relevance to this issue. However, it is not the whole story.
@@ -3300,7 +3208,7 @@ uninitialized, and possibly equal to an existing pointer value, or8.5 paragraph 5 seems to make clear that the second is required to -satisfy DR 235, at least for non-class Iterator argument +satisfy DR 235, at least for non-class Iterator argument types.
@@ -3327,7 +3235,7 @@ are default-initialized, and it should explicitly allow destroying any iterator value, singular or not, default-initialized or not. -Related issue: 407
+Related issue: 407
Proposed resolution:
[ @@ -3341,9 +3249,9 @@ wrong to impose so strict a requirement for iterators. ]
-409. Closing an fstream should clear error state
Section: 27.8.1.7 [lib.ifstream.members], 27.8.1.10 [lib.ofstream.members] Status: Review Submitter: Nathan Myers Date: 3 June 2003
+409. Closing an fstream should clear error state
Section: 27.8.1.7 [lib.ifstream.members], 27.8.1.10 [lib.ofstream.members] Status: Ready Submitter: Nathan Myers Date: 3 June 2003
-A strict reading of 27.8.1 [lib.fstreams] shows that opening or +A strict reading of 27.8.1 [lib.fstreams] shows that opening or closing a basic_[io]fstream does not affect the error bits. This means, for example, that if you read through a file up to EOF, and then close the stream and reopen it at the beginning of the file, @@ -3351,7 +3259,7 @@ the EOF bit in the stream's error state is still set. This is counterintuitive.
-The LWG considered this issue once before, as issue 22, +The LWG considered this issue once before, as issue 22, and put in a footnote to clarify that the strict reading was indeed correct. We did that because we believed the standard was unambiguous and consistent, and that we should not make architectural @@ -3360,40 +3268,47 @@ language, those considerations no longer apply.
Proposed resolution:
-Change 27.8.1.7 [lib.ifstream.members], para. 3 from:
+Change 27.8.1.7 [lib.ifstream.members], para. 3 from:
-Calls rdbuf()->open(s,mode|in). If that function returns a null pointer, calls setstate(failbit) (which may throw ios_base::failure [Footnote: (lib.iostate.flags)). +Calls rdbuf()->open(s,mode|in). If that function returns a null +pointer, calls setstate(failbit) (which may throw ios_base::failure +[Footnote: (lib.iostate.flags)].to:
--Calls rdbuf()->open(s,mode|in). If that function returns a null pointer, calls setstate(failbit) (which may throw ios_base::failure [Footnote: (lib.iostate.flags)), else calls clear(). +Calls rdbuf()->open(s,mode|in). If that function returns +a null pointer, calls setstate(failbit) (which may throw +ios_base::failure [Footnote: (lib.iostate.flags)), else calls clear().-Change 27.8.1.10 [lib.ofstream.members], para. 3 from:
+Change 27.8.1.10 [lib.ofstream.members], para. 3 from:
--Calls rdbuf()->open(s,mode|out). If that function returns a null pointer, calls setstate(failbit) (which may throw ios_base::failure [Footnote: (lib.iostate.flags)). +Calls rdbuf()->open(s,mode|out). If that function +returns a null pointer, calls setstate(failbit) (which may throw +ios_base::failure [Footnote: (lib.iostate.flags)).to:
--Calls rdbuf()->open(s,mode|out). If that function returns a null pointer, calls setstate(failbit) (which may throw ios_base::failure [Footnote: (lib.iostate.flags)), else calls clear(). +Calls rdbuf()->open(s,mode|out). If that function +returns a null pointer, calls setstate(failbit) (which may throw +ios_base::failure [Footnote: (lib.iostate.flags)), else calls clear().-Change 27.8.1.13 [lib.fstream.members], para. 3 from:
+Change 27.8.1.13 [lib.fstream.members], para. 3 from:
--Calls rdbuf()->open(s,mode), If that function returns a null pointer, calls setstate(failbit), (which may throw ios_base::failure). (lib.iostate.flags) ) +Calls rdbuf()->open(s,mode), If that function returns a +null pointer, calls setstate(failbit), (which may throw +ios_base::failure). (lib.iostate.flags) )to:
--Calls rdbuf()->open(s,mode), If that function returns a null pointer, calls setstate(failbit), (which may throw ios_base::failure). (lib.iostate.flags) ), else calls clear(). +Calls rdbuf()->open(s,mode), If that function returns a +null pointer, calls setstate(failbit), (which may throw +ios_base::failure). (lib.iostate.flags) ), else calls clear().@@ -3409,108 +3324,7 @@ flags.] of the three fstream class template instead.]
-410. Missing semantics for stack and queue comparison operators
Section: 23.2.3.1 [lib.queue], 23.2.3.3 [lib.stack] Status: Ready Submitter: Hans Bos Date: 7 Jun 2003
--Sections 23.2.3.1 [lib.queue] and 23.2.3.3 [lib.stack] list -comparison operators (==, !=, <, <=, >, =>) for queue and -stack. Only the semantics for queue::operator== (23.2.3.1 [lib.queue] par2) and queue::operator< (23.2.3.1 [lib.queue] -par3) are defined. -
-Proposed resolution:
- -Add the following new paragraphs after 23.2.3.1 [lib.queue] - paragraph 3:
- -- -- -- operator!= --Returns: x.c != y.c
- -- operator> --Returns: x.c > y.c
- -- operator<= --Returns: x.c <= y.c
- -- operator>= --Returns: x.c >= y.c
- -Add the following paragraphs at the end of 23.2.3.3 [lib.stack]:
- -- -- - -- operator== --Returns: x.c == y.c
- -- operator< --Returns: x.c < y.c
- -- operator!= --Returns: x.c != y.c
- -- operator> --Returns: x.c > y.c
- -- operator<= --Returns: x.c <= y.c
- -- operator>= --Returns: x.c >= y.c
- -[Kona: Matt provided wording.]
- -Rationale:
-There isn't any real doubt about what these operators are -supposed to do, but we ought to spell it out. -
-412. Typo in 27.4.4.3
Section: 27.4.4.3 [lib.iostate.flags] Status: Ready Submitter: Martin Sebor Date: 10 Jul 2003
--The Effects clause in 27.4.4.3 [lib.iostate.flags] paragraph 5 says that the -function only throws if the respective bits are already set prior to -the function call. That's obviously not the intent. The typo ought to -be corrected and the text reworded as: "If (state & -exceptions()) == 0, returns. ..." -
-Proposed resolution:
--In 27.4.4.3 [lib.iostate.flags] paragraph 5, replace "If (rdstate() & -exceptions()) == 0" with "If ((state | (rdbuf() ? goodbit : badbit)) -& exceptions()) == 0". -
- -[Kona: the original proposed resolution wasn't quite right. We - really do mean rdstate(); the ambiguity is that the wording in the - standard doesn't make it clear whether we mean rdstate() before - setting the new state, or rdsate() after setting it. We intend the - latter, of course. Post-Kona: Martin provided wording.]
- -
-413. Proposed resolution to LDR#64 still wrong
Section: 27.6.1.2.3 [lib.istream::extractors] Status: Open Submitter: Bo Persson Date: 13 Jul 2003
+413. Proposed resolution to LDR#64 still wrong
Section: 27.6.1.2.3 [lib.istream::extractors] Status: Ready Submitter: Bo Persson Date: 13 Jul 2003
The second sentence of the proposed resolution says:
@@ -3529,7 +3343,7 @@ basic_istream (*this) and inserting into sb. I can't really tell if[ Sydney: Definitely a real issue. We are, indeed, extracting characters from an istream and not from sb. The problem was there in the FDIS and -wasn't fixed by issue 64. Probably what was intended was +wasn't fixed by issue 64. Probably what was intended was to have *this instead of sb. We're talking about the exception flag state of a basic_istream object, and there's only one basic_istream object in this discussion, so that would be a consistent @@ -3539,36 +3353,23 @@ extractors.) PJP will provide wording. ]
Proposed resolution:
+Change the sentence from:
+ ++If it inserted no characters because it caught an exception thrown +while extracting characters from sb and failbit is on in exceptions(), +then the caught exception is rethrown. ++ +to:
+ ++If it inserted no characters because it caught an exception thrown +while extracting characters from *this and failbit is on in exceptions(), +then the caught exception is rethrown. +
-415. behavior of std::ws
Section: 27.6.1.4 [lib.istream.manip] Status: Ready Submitter: Martin Sebor Date: 18 Sep 2003
--According to 27.6.1.4, the ws() manipulator is not required to construct -the sentry object. The manipulator is also not a member function so the -text in 27.6.1, p1 through 4 that describes the exception policy for -istream member functions does not apply. That seems inconsistent with -the rest of extractors and all the other input functions (i.e., ws will -not cause a tied stream to be flushed before extraction, it doesn't check -the stream's exceptions or catch exceptions thrown during input, and it -doesn't affect the stream's gcount). -
-Proposed resolution:
--Add to 27.6.1.4 [lib.istream.manip], immediately before the first sentence -of paragraph 1, the following text: -
- -- Behaves as an unformatted input function (as described in - 27.6.1.3, paragraph 1), except that it does not count the number - of characters extracted and does not affect the value returned by - subsequent calls to is.gcount(). After constructing a sentry - object... -- -[Post-Kona: Martin provided wording]
- -
-416. definitions of XXX_MIN and XXX_MAX macros in climits
Section: 18.2.2 [lib.c.limits] Status: Open Submitter: Martin Sebor Date: 18 Sep 2003
+416. definitions of XXX_MIN and XXX_MAX macros in climits
Section: 18.2.2 [lib.c.limits] Status: Open Submitter: Martin Sebor Date: 18 Sep 2003
Given two overloads of the function foo(), one taking an argument of type @@ -3617,7 +3418,7 @@ where the actual type is easily detectable by overload resolution. <climits>.]
-417. what does ctype::do_widen() return on failure
Section: 22.2.1.1.2 [lib.locale.ctype.virtuals] Status: Open Submitter: Martin Sebor Date: 18 Sep 2003
+417. what does ctype::do_widen() return on failure
Section: 22.2.1.1.2 [lib.locale.ctype.virtuals] Status: Open Submitter: Martin Sebor Date: 18 Sep 2003
The Effects and Returns clauses of the do_widen() member function of the ctype facet fail to specify the behavior of the function on failure. @@ -3639,7 +3440,7 @@ and iostream to reliably detect this failure. existing library components aren't written with the assumption that widen can throw.]
-418. exceptions thrown during iostream cleanup
Section: 27.4.2.1.6 [lib.ios::Init] Status: Open Submitter: Martin Sebor Date: 18 Sep 2003
+418. exceptions thrown during iostream cleanup
Section: 27.4.2.1.6 [lib.ios::Init] Status: Open Submitter: Martin Sebor Date: 18 Sep 2003
The dtor of the ios_base::Init object is supposed to call flush() on the 6 standard iostream objects cout, cerr, clog, wcout, wcerr, and wclog. @@ -3665,7 +3466,7 @@ object throws. might reasonably swallow the exception, or call abort, or do something even more drastic.]
-419. istream extractors not setting failbit if eofbit is already set
Section: 27.6.1.1.2 [lib.istream::sentry] Status: Open Submitter: Martin Sebor Date: 18 Sep 2003
+419. istream extractors not setting failbit if eofbit is already set
Section: 27.6.1.1.2 [lib.istream::sentry] Status: Open Submitter: Martin Sebor Date: 18 Sep 2003
27.6.1.1.2, p2 says that istream::sentry ctor prepares for input if is.good() @@ -3684,7 +3485,6 @@ eof = 1, fail = 1 on all of them.
- #include <sstream> #include <cstdio> @@ -3744,7 +3544,7 @@ corrected. clearer.
-421. is basic_streambuf copy-constructible?
Section: 27.5.2.1 [lib.streambuf.cons] Status: Open Submitter: Martin Sebor Date: 18 Sep 2003
+421. is basic_streambuf copy-constructible?
Section: 27.5.2.1 [lib.streambuf.cons] Status: Open Submitter: Martin Sebor Date: 18 Sep 2003
The reflector thread starting with c++std-lib-11346 notes that the class template basic_streambuf, along with basic_stringbuf and basic_filebuf, @@ -3763,7 +3563,7 @@ of the standard provide a compiler-generated copy ctor and assignment operator yet fail to specify their semantics. It's believed that the only types for which this is actually a problem (i.e. types where the compiler-generated default may be inappropriate and may not have been -intended) are locale facets. See issue 439. +intended) are locale facets. See issue 439.
Proposed resolution:
@@ -3771,22 +3571,19 @@ intended) are locale facets. See issue 439.
--basic_streambuf(const basic_streambuf& sb); +basic_streambuf(const basic_streambuf& sb); basic_streambuf& operator=(const basic_streambuf& sb);Insert after 27.5.2.1, paragraph 2:
--basic_streambuf(const basic_streambuf& sb); +basic_streambuf(const basic_streambuf& sb);Constructs a copy of sb.
Postcondtions:
-- eback() == sb.eback() +eback() == sb.eback() gptr() == sb.gptr() egptr() == sb.egptr() pbase() == sb.pbase() @@ -3795,15 +3592,13 @@ basic_streambuf(const basic_streambuf& sb); getloc() == sb.getloc()--basic_streambuf& operator=(const basic_streambuf& sb); +basic_streambuf& operator=(const basic_streambuf& sb);Assigns the data members of sb to this.
Postcondtions:
-- eback() == sb.eback() +eback() == sb.eback() gptr() == sb.gptr() egptr() == sb.egptr() pbase() == sb.pbase() @@ -3822,8 +3617,7 @@ basic_streambuf& operator=(const basic_streambuf& sb);@@ -3833,8 +3627,7 @@ basic_stringbuf& operator=(const basic_stringbuf&); // not definedInsert into the basic_stringbuf synopsis in the private section:
--basic_stringbuf(const basic_stringbuf&); // not defined +basic_stringbuf(const basic_stringbuf&); // not defined basic_stringbuf& operator=(const basic_stringbuf&); // not defined@@ -3870,8 +3665,7 @@ After assignment the basic_stringbuf has the same state as if it were initiallyInsert into the basic_stringbuf synopsis in the public section:
--basic_stringbuf(const basic_stringbuf& sb); +basic_stringbuf(const basic_stringbuf& sb); basic_stringbuf& operator=(const basic_stringbuf& sb);@@ -3847,21 +3640,23 @@ Constructs an independent copy of sb as if with sb.str(), and with the openmodePostcondtions:
-- str() == sb.str() +str() == sb.str() gptr() - eback() == sb.gptr() - sb.eback() egptr() - eback() == sb.egptr() - sb.eback() pptr() - pbase() == sb.pptr() - sb.pbase() getloc() == sb.getloc()--Note: The only requirement on epptr() is that it point beyond the initialized range if an output sequence exists. There is no requirement that epptr() - pbase() == sb.epptr() - sb.pbase(). +
Note: The only requirement on epptr() is that it point beyond the +initialized range if an output sequence exists. There is no requirement +that epptr() - pbase() == sb.epptr() - sb.pbase().
basic_stringbuf& operator=(const basic_stringbuf& sb);--After assignment the basic_stringbuf has the same state as if it were initially copy constructed from sb, except that the basic_stringbuf is allowed to retain any excess capacity it might have, which may in turn effect the value of epptr(). +
After assignment the basic_stringbuf has the same state as if it +were initially copy constructed from sb, except that the +basic_stringbuf is allowed to retain any excess capacity it might have, +which may in turn effect the value of epptr().
Insert at the bottom of the basic_filebuf synopsis:
--private: +private: basic_filebuf(const basic_filebuf&); // not defined basic_filebuf& operator=(const basic_filebuf&); // not defined@@ -3921,7 +3715,7 @@ basic_filebuf.
-422. explicit specializations of member functions of class templates
Section: 17.4.3.1 [lib.reserved.names] Status: Open Submitter: Martin Sebor Date: 18 Sep 2003
+422. explicit specializations of member functions of class templates
Section: 17.4.3.1 [lib.reserved.names] Status: Open Submitter: Martin Sebor Date: 18 Sep 2003
It has been suggested that 17.4.3.1, p1 may or may not allow programs to explicitly specialize members of standard templates on user-defined types. @@ -3935,7 +3729,7 @@ the program) by relying on the "as if" rule.
Proposed resolution:
- Add the following sentence immediately after the text of 17.4.3.1 [lib.reserved.names], p1: + Add the following sentence immediately after the text of 17.4.3.1 [lib.reserved.names], p1:
@@ -3959,7 +3753,7 @@ library class templates. We need to consult with CWG to make sure we use the right wording.]
-423. effects of negative streamsize in iostreams
Section: 27 [lib.input.output] Status: Open Submitter: Martin Sebor Date: 18 Sep 2003
+423. effects of negative streamsize in iostreams
Section: 27 [lib.input.output] Status: Open Submitter: Martin Sebor Date: 18 Sep 2003
A third party test suite tries to exercise istream::ignore(N) with @@ -3989,7 +3783,7 @@ ostream::write(). negative. Martin will do that review.]
-424. normative notes
Section: 17.3.1.1 [lib.structure.summary] Status: Open Submitter: Martin Sebor Date: 18 Sep 2003
+424. normative notes
Section: 17.3.1.1 [lib.structure.summary] Status: Open Submitter: Martin Sebor Date: 18 Sep 2003
The text in 17.3.1.1, p1 says: @@ -4040,89 +3834,7 @@ None of these lists is meant to be exhaustive. ]
-425. return value of std::get_temporary_buffer
Section: 20.4.3 [lib.temporary.buffer] Status: Ready Submitter: Martin Sebor Date: 18 Sep 2003
--The standard is not clear about the requirements on the value returned from -a call to get_temporary_buffer(0). In particular, it fails to specify whether -the call should return a distinct pointer each time it is called (like -operator new), or whether the value is unspecified (as if returned by -malloc). The standard also fails to mention what the required behavior -is when the argument is less than 0. -
-Proposed resolution:
-Change 20.4.3 [lib.temporary.buffer] paragraph 2 from "...or a pair of 0 -values if no storage can be obtained" to "...or a pair of 0 values if -no storage can be obtained or if n <= 0."
-[Kona: Matt provided wording]
-
-426. search_n(), fill_n(), and generate_n() with negative n
Section: 25.1.9 [lib.alg.search], 25.2.5 [lib.alg.fill], 25.2.6 [lib.alg.generate] Status: Ready Submitter: Martin Sebor Date: 18 Sep 2003
--The complexity requirements for these function templates are incorrect -(or don't even make sense) for negative n:
- -25.1.9, p7 (search_n): -
- -
-Complexity: At most (last1 - first1) * count applications -of the corresponding predicate.25.2.5, p3 (fill_n): -
-
-Complexity: Exactly last - first (or n) assignments.
- -25.2.6, p3 (generate_n): -
- -
-Complexity: Exactly last - first (or n) assignments.-In addition, the Requirements or the Effects clauses for the latter two -templates don't say anything about the behavior when n is negative. -
-Proposed resolution:
-Change 25.1.9, p7 to
- --Complexity: At most (last1 - first1) * count applications -of the corresponding predicate if count is positive, -or 0 otherwise. -- -Change 25.2.5, p2 to
--Effects: Assigns value through all the iterators in the range [first, -last), or [first, first + n) if n is positive, none otherwise. -- -Change 25.2.5, p3 to:
--Complexity: Exactly last - first (or n if n is positive, -or 0 otherwise) assignments. -- --Change 25.2.6, p1 -to (notice the correction for the misspelled "through"): -
--Effects: Invokes the function object genand assigns the return -value of gen through all the iterators in the range [first, last), -or [first, first + n) if n is positive, or [first, first) -otherwise. -- -Change 25.2.6, p3 to:
--Complexity: Exactly last - first (or n if n is positive, -or 0 otherwise) assignments. --Rationale:
-Informally, we want to say that whenever we see a negative number - we treat it the same as if it were zero. We believe the above - changes do that (although they may not be the minimal way of saying - so). The LWG considered and rejected the alternative of saying that - negative numbers are undefined behavior.
-
-427. stage 2 and rationale of DR 221
Section: 22.2.2.1.2 [lib.facet.num.get.virtuals] Status: Open Submitter: Martin Sebor Date: 18 Sep 2003
+427. stage 2 and rationale of DR 221
Section: 22.2.2.1.2 [lib.facet.num.get.virtuals] Status: Open Submitter: Martin Sebor Date: 18 Sep 2003
The requirements specified in Stage 2 and reiterated in the rationale of DR 221 (and echoed again in DR 303) specify that num_get<charT>:: @@ -4153,7 +3865,7 @@ instantiate the num_get template on user-defined types. and traits is in order. The LWG considered and rejected the possibility of changing numeric facets to use narrowing instead of widening. This may be a good idea for other reasons (see issue - 459), but it doesn't solve the problem raised by this + 459), but it doesn't solve the problem raised by this issue. Whether we use widen or narrow the num_get facet still has no idea which traits class the user wants to use for the comparison, because only streams, not facets, are passed traits @@ -4169,7 +3881,7 @@ traits classes, then the facet could reasonably be required to use char_traits<charT>
.
-430. valarray subset operations
Section: 26.3.2.4 [lib.valarray.sub] Status: Open Submitter: Martin Sebor Date: 18 Sep 2003
+430. valarray subset operations
Section: 26.3.2.4 [lib.valarray.sub] Status: Open Submitter: Martin Sebor Date: 18 Sep 2003
The standard fails to specify the behavior of valarray::operator[](slice) and other valarray subset operations when they are passed an "invalid" @@ -4183,8 +3895,8 @@ object (e.g., slice (2, 1, 1) for a valarray of size 1). performance, so we don't want to require specific checking. We need wording to express this decision.]
-431. Swapping containers with unequal allocators
Section: 20.1.5 [lib.allocator.requirements], 25 [lib.algorithms] Status: Open Submitter: Matt Austern Date: 20 Sep 2003
-Clause 20.1.5 [lib.allocator.requirements] paragraph 4 says that implementations +
431. Swapping containers with unequal allocators
Section: 20.1.5 [lib.allocator.requirements], 25 [lib.algorithms] Status: Open Submitter: Matt Austern Date: 20 Sep 2003
+Clause 20.1.5 [lib.allocator.requirements] paragraph 4 says that implementations are permitted to supply containers that are unable to cope with allocator instances and that container implementations may assume that all instances of an allocator type compare equal. We gave @@ -4207,8 +3919,7 @@ object (e.g., slice (2, 1, 1) for a valarray of size 1).
3. The operation swaps both the vectors' contents and their allocators. This would be an O(1) operation. That is:
-- my_alloc a1(...); +my_alloc a1(...); my_alloc a2(...); assert(a1 != a2); @@ -4231,278 +3942,7 @@ object (e.g., slice (2, 1, 1) for a valarray of size 1).[pre-Sydney: Howard argues for option 3 in n1599.]
-432. stringbuf::overflow() makes only one write position available
Section: 27.7.1.3 [lib.stringbuf.virtuals] Status: Ready Submitter: Christian W Brock Date: 24 Sep 2003
-27.7.1.3 par 8 says:
--Notes: The function can make a write position available only if - ( mode & ios_base::out) != 0. To make a write position - available, the function reallocates (or initially allocates) an - array object with a sufficient number of elements to hold the - current array object (if any), plus one additional write position. - If ( mode & ios_base::in) != 0, the function alters the read end - pointer egptr() to point just past the new write position (as - does the write end pointer epptr()). -- --The sentences "plus one additional write position." and especially - "(as does the write end pointer epptr())" COULD by interpreted - (and is interpreted by at least my library vendor) as: -
- -- post-condition: epptr() == pptr()+1 -- --This WOULD force sputc() to call the virtual overflow() each time. -
- -The proposed change also affects Defect Report 169.
- -Proposed resolution:
-27.7.1.1/2 Change:
- --2- Notes: The function allocates no array object. -- --to: -
- --2- Postcondition: str() == "". -- --27.7.1.1/3 Change: -
- --- ---3- Effects: Constructs an object of class basic_stringbuf, -initializing the base class with basic_streambuf() -(lib.streambuf.cons), and initializing mode with which . Then copies -the content of str into the basic_stringbuf underlying character -sequence and initializes the input and output sequences according to -which. If which & ios_base::out is true, initializes the output -sequence with the underlying sequence. If which & ios_base::in is -true, initializes the input sequence with the underlying sequence. -
-to:
- --- ---3- Effects: Constructs an object of class basic_stringbuf, -initializing the base class with basic_streambuf() -(lib.streambuf.cons), and initializing mode with which. Then copies -the content of str into the basic_stringbuf underlying character -sequence. If which & ios_base::out is true, initializes the output -sequence such that pbase() points to the first underlying character, -epptr() points one past the last underlying character, and if (which & -ios_base::ate) is true, pptr() is set equal to -epptr() else pptr() is set equal to pbase(). If which & ios_base::in -is true, initializes the input sequence such that eback() and gptr() -point to the first underlying character and egptr() points one past -the last underlying character. -
-27.7.1.2/1 Change:
- --- ---1- Returns: A basic_string object whose content is equal to the -basic_stringbuf underlying character sequence. If the buffer is only -created in input mode, the underlying character sequence is equal to -the input sequence; otherwise, it is equal to the output sequence. In -case of an empty underlying character sequence, the function returns -basic_string<charT,traits,Allocator>(). -
-to:
- --- ---1- Returns: A basic_string object whose content is equal to the -basic_stringbuf underlying character sequence. If the basic_stringbuf -was created only in input mode, the resultant basic_string contains -the character sequence in the range [eback(), egptr()). If the -basic_stringbuf was created with (which & ios_base::out) being true -then the resultant basic_string contains the character sequence in the -range [pbase(), high_mark) where high_mark represents the position one -past the highest initialized character in the buffer. Characters can -be initialized either through writing to the stream, or by -constructing the basic_stringbuf with a basic_string, or by calling -the str(basic_string) member function. In the case of calling the -str(basic_string) member function, all characters initialized prior to -the call are now considered uninitialized (except for those -characters re-initialized by the new basic_string). Otherwise the -basic_stringbuf has been created in neither input nor output mode and -a zero length basic_string is returned. -
--27.7.1.2/2 Change: -
- --- ---2- Effects: If the basic_stringbuf's underlying character sequence is -not empty, deallocates it. Then copies the content of s into the -basic_stringbuf underlying character sequence and initializes the -input and output sequences according to the mode stored when creating -the basic_stringbuf object. If (mode&ios_base::out) is true, then -initializes the output sequence with the underlying sequence. If -(mode&ios_base::in) is true, then initializes the input sequence with -the underlying sequence. -
-to:
- --- ---2- Effects: Copies the content of s into the basic_stringbuf -underlying character sequence. If mode & ios_base::out is true, -initializes the output sequence such that pbase() points to the first -underlying character, epptr() points one past the last underlying -character, and if (mode & ios_base::ate) is true, -pptr() is set equal to epptr() else pptr() is set equal to pbase(). If -mode & ios_base::in is true, initializes the input sequence such that -eback() and gptr() point to the first underlying character and egptr() -points one past the last underlying character. -
-Remove 27.2.1.2/3. (Same rationale as issue 238: incorrect and unnecessary.)
- -27.7.1.3/1 Change:
- --- --1- Returns: If the input sequence has a read position available, -returns traits::to_int_type(*gptr()). Otherwise, returns -traits::eof(). -
-to:
- --- --1- Returns: If the input sequence has a read position available, -returns traits::to_int_type(*gptr()). Otherwise, returns -traits::eof(). Any character in the underlying buffer which has been -initialized is considered to be part of the input sequence. -
-27.7.1.3/9 Change:
- --- ---9- Notes: The function can make a write position available only if ( -mode & ios_base::out) != 0. To make a write position available, the -function reallocates (or initially allocates) an array object with a -sufficient number of elements to hold the current array object (if -any), plus one additional write position. If ( mode & ios_base::in) != -0, the function alters the read end pointer egptr() to point just past -the new write position (as does the write end pointer epptr()). -
-to:
- --- ---9- The function can make a write position available only if ( mode & -ios_base::out) != 0. To make a write position available, the function -reallocates (or initially allocates) an array object with a sufficient -number of elements to hold the current array object (if any), plus one -additional write position. If ( mode & ios_base::in) != 0, the -function alters the read end pointer egptr() to point just past the -new write position. -
-27.7.1.3/12 Change:
- --- ---12- _ If (newoff + off) < 0, or (xend - xbeg) < (newoff + off), the -positioning operation fails. Otherwise, the function assigns xbeg + -newoff + off to the next pointer xnext . -
-to:
- --- ---12- _ If (newoff + off) < 0, or if (newoff + off) refers to an -uninitialized character (as defined in 27.7.1.2 [lib.stringbuf.members] -paragraph 1), the positioning operation fails. Otherwise, the function -assigns xbeg + newoff + off to the next pointer xnext . -
-[post-Kona: Howard provided wording. At Kona the LWG agreed that - something along these lines was a good idea, but the original - proposed resolution didn't say enough about the effect of various - member functions on the underlying character sequences.]
- -Rationale:
-The current basic_stringbuf description is over-constrained in such -a way as to prohibit vendors from making this the high-performance -in-memory stream it was meant to be. The fundamental problem is that -the pointers: eback(), gptr(), egptr(), pbase(), pptr(), epptr() are -observable from a derived client, and the current description -restricts the range [pbase(), epptr()) from being grown geometrically. -This change allows, but does not require, geometric growth of this -range.
- -Backwards compatibility issues: These changes will break code that -derives from basic_stringbuf, observes epptr(), and depends upon -[pbase(), epptr()) growing by one character on each call to overflow() -(i.e. test suites). Otherwise there are no backwards compatibility -issues.
- -27.7.1.1/2: The non-normative note is non-binding, and if it were -binding, would be over specification. The recommended change focuses -on the important observable fact.
- -27.7.1.1/3: This change does two things: 1. It describes exactly -what must happen in terms of the sequences. The terms "input -sequence" and "output sequence" are not well defined. 2. It -introduces a common extension: open with app or ate mode. I concur -with issue 238 that paragraph 4 is both wrong and unnecessary.
- -27.7.1.2/1: This change is the crux of the efficiency issue. The -resultant basic_string is not dependent upon epptr(), and thus -implementors are free to grow the underlying buffer geometrically -during overflow() *and* place epptr() at the end of that buffer.
- -27.7.1.2/2: Made consistent with the proposed 27.7.1.1/3.
- -27.7.1.3/1: Clarifies that characters written to the stream beyond -the initially specified string are available for reading in an i/o -basic_streambuf.
- -27.7.1.3/9: Made normative by removing "Notes:", and removed the -trailing parenthetical comment concerning epptr().
- -27.7.1.3/12: Restricting the positioning to [xbeg, xend) is no -longer allowable since [pbase(), epptr()) may now contain -uninitialized characters. Positioning is only allowable over the -initialized range.
-
-434. bitset::to_string() hard to use
Section: 23.3.5.2 [lib.bitset.members] Status: Review Submitter: Martin Sebor Date: 15 Oct 2003
+434. bitset::to_string() hard to use
Section: 23.3.5.2 [lib.bitset.members] Status: Ready Submitter: Martin Sebor Date: 15 Oct 2003
It has been pointed out a number of times that the bitset to_string() member function template is tedious to use since callers must explicitly specify the @@ -4517,8 +3957,7 @@ interface (declarations only) of the class template bitset as well as to section 23.3.5.2, immediately after p34, the Returns clause of the existing to_string() member function template:
-- template <class charT, class traits> +template <class charT, class traits> basic_string<charT, traits, allocator<charT> > to_string () const; @@ -4543,80 +3982,26 @@ to_string() member function template: ]
-435. bug in DR 25
Section: 21.3.7.9 [lib.string.io] Status: Ready Submitter: Martin Sebor Date: 15 Oct 2003
+438. Ambiguity in the "do the right thing" clause
Section: 23.1.1 [lib.sequence.reqmts] Status: Ready Submitter: Howard Hinnant Date: 20 Oct 2003
--It has been pointed out that the proposed resolution in DR 25 may not be -quite up to snuff:
- -
-http://gcc.gnu.org/ml/libstdc++/2003-09/msg00147.html -http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-defects.html#25
--It looks like Petur is right. The complete corrected text is copied below. -I think we may have have been confused by the reference to 22.2.2.2.2 and -the subsequent description of `n' which actually talks about the second -argument to sputn(), not about the number of fill characters to pad with. -
- --So the question is: was the original text correct? If the intent was to -follow classic iostreams then it most likely wasn't, since setting width() -to less than the length of the string doesn't truncate it on output. This -is also the behavior of most implementations (except for SGI's standard -iostreams where the operator does truncate). -
-Proposed resolution:
-Change the text in 21.3.7.9, p4 from
-- If bool(k) is true, inserts characters as if by calling - os.rdbuf()->sputn(str.data(), n), padding as described in stage 3 - of lib.facet.num.put.virtuals, where n is the larger of os.width() - and str.size(); --to
-- If bool(k) is true, determines padding as described in - lib.facet.num.put.virtuals, and then inserts the resulting - sequence of characters seq as if by calling - os.rdbuf()->sputn(seq, n), where n is the larger of - os.width() and str.size(); -- -[Kona: it appears that neither the original wording, DR25, nor the - proposed resolution, is quite what we want. We want to say that - the string will be output, padded to os.width() if necessary. We - don't want to duplicate the padding rules in clause 22, because - they're complicated, but we need to be careful because they weren't - quite written with quite this case in mind. We need to say what - the character sequence is, and then defer to clause 22. Post-Kona: - Benjamin provided wording.]
- -
-438. Ambiguity in the "do the right thing" clause
Section: 23.1.1 [lib.sequence.reqmts] Status: Review Submitter: Howard Hinnant Date: 20 Oct 2003
- -Section 23.1.1 [lib.sequence.reqmts], paragraphs 9-11, fixed up the problem +
Section 23.1.1 [lib.sequence.reqmts], paragraphs 9-11, fixed up the problem noticed with statements like:
--vector<int> v(10, 1); +vector<int> v(10, 1);The intent of the above statement was to construct with:
--vector(size_type, const value_type&); +vector(size_type, const value_type&);but early implementations failed to compile as they bound to:
--template <class InputIterator> +template <class InputIterator> vector(InputIterator f, InputIterator l);instead.
Paragraphs 9-11 say that if InputIterator is an integral type, then the member template constructor will have the same effect as:
--vector<static_cast<size_type>(f), static_cast<value_type>(l)); +vector<static_cast<size_type>(f), static_cast<value_type>(l));(and similarly for the other member template functions of sequences).
@@ -4628,8 +4013,7 @@ vector<static_cast<size_type>(f), static_cast<value_type>(l));This might look something like:
--template <class T> +template <class T> struct vector { typedef unsigned size_type; @@ -4671,8 +4055,7 @@ every call with the member template, detect the type of InputIterator, and then redirect to the correct logic. Something like:--template <class T> +template <class T> template <class I> vector<T>::vector(I f, I l) { @@ -4701,8 +4084,7 @@ vector<T>::choose_init(I f, I l, int2type<true>)Both of these solutions solve the case the standard specifically mentions:
--vector<int> v(10, 1); // ok, vector size 10, initialized to 1 +vector<int> v(10, 1); // ok, vector size 10, initialized to 1@@ -4710,8 +4092,7 @@ However, (and here is the problem), the two solutions have different behavior in some cases where the value_type of the sequence is not an integral type. For example consider:
-- pair<char, char> p('a', 'b'); +pair<char, char> p('a', 'b'); vector<vector<pair<char, char> > > d('a', 'b');@@ -4719,8 +4100,7 @@ The second line of this snippet is likely an error. Solution A catches the error and refuses to compile. The reason is that there is no specialization of the member template constructor that looks like:
--template <> +template <> template <> vector<vector<pair<char, char> > >::vector(char, char) { ... }@@ -4737,8 +4117,7 @@ unsigned integral type and used to size the outer vector. 'b' is static casted to the inner vector using it's explicit constructor: --explicit vector(size_type n); +explicit vector(size_type n);@@ -4755,8 +4134,7 @@ explicit qualifier on the inner vector has been thwarted at any rate. The standard is not clear whether the expression:
-- vector<vector<pair<char, char> > > d('a', 'b'); +vector<vector<pair<char, char> > > d('a', 'b');@@ -4791,8 +4169,7 @@ the expression above would be to change "static_cast" in paragraphs
--template <class T, class U> +template <class T, class U> inline T implicit_cast(const U& u) { @@ -4803,32 +4180,29 @@ T implicit_cast(const U& u)Proposed resolution:
-Replace 23.1.1 [lib.sequence.reqmts] paragraphs 9 - 11 with: +Replace 23.1.1 [lib.sequence.reqmts] paragraphs 9 - 11 with:For every sequence defined in this clause and in clause lib.strings:
If the constructor
-- template <class InputIterator> +template <class InputIterator> X(InputIterator f, InputIterator l, const allocator_type& a = allocator_type())is called with a type InputIterator that does not qualify as an input iterator, then the constructor will behave as if the overloaded constructor:
-- X(size_type, const value_type& = value_type(), +X(size_type, const value_type& = value_type(), const allocator_type& = allocator_type())-were called instead, with the arguments f, l and a, respectively.
+were called instead, with the arguments static_cast<size_type>(f), l and a, respectively.
If the member functions of the forms:
-- template <class InputIterator> // such as insert() +template <class InputIterator> // such as insert() rt fx1(iterator p, InputIterator f, InputIterator l); template <class InputIterator> // such as append(), assign() @@ -4840,8 +4214,7 @@ Replace 23.1.1 [lib.sequence.are called with a type InputIterator that does not qualify as an input iterator, then these functions will behave as if the overloaded member functions:
-- rt fx1(iterator, size_type, const value_type&); +rt fx1(iterator, size_type, const value_type&); rt fx2(size_type, const value_type&); @@ -4881,11 +4254,15 @@ Howard submitted new wording, and we will review this again in Redmond. ] +[Redmond: one very small change in wording: the first argument + is cast to size_t. This fixes the problem of something like + vector<vector<int> >(5, 5), where int is not + implicitly convertible to the value type.]
+Rationale:
The proposed resolution fixes:
-- vector<int> v(10, 1); +vector<int> v(10, 1);@@ -4895,8 +4272,7 @@ if).
The proposed resolution breaks:
-- vector<vector<T> > v(10, 1); +vector<vector<T> > v(10, 1);@@ -4908,8 +4284,7 @@ The proposed resolution leaves the behavior of the following code unspecified.
-- struct A +struct A { operator int () const {return 10;} }; @@ -4930,45 +4305,10 @@ then the implementation must reject the constructor as A is no longer implicitly convertible to B.
-441. Is fpos::state const?
Section: 27.4.3 [lib.fpos] Status: Ready Submitter: Vincent Leloup Date: 17 Nov 2003
+444. Bad use of casts in fstream
Section: 27.8.1 [lib.fstreams] Status: Ready Submitter: Vincent Leloup Date: 20 Nov 2003
-In section 27.4.3.1 [lib.fpos.members] fpos<stateT>::state() is declared -non const, but in section 27.4.3 [lib.fpos] it is declared const. -
-Proposed resolution:
--In section 27.4.3.1 [lib.fpos.members], change the declaration of -fpos<stateT>::state() to const. -
-
-442. sentry::operator bool() inconsistent signature
Section: 27.6.2.3 [lib.ostream::sentry] Status: Ready Submitter: Vincent Leloup Date: 18 Nov 2003
--In section 27.6.2.3 [lib.ostream::sentry] paragraph 4, in description part -basic_ostream<charT, traits>::sentry::operator bool() is declared -as non const, but in section 27.6.2.3, in synopsis it is declared -const. -
-Proposed resolution:
--In section 27.6.2.3 [lib.ostream::sentry] paragraph 4, change the declaration -of sentry::operator bool() to const. -
-
-443. filebuf::close() inconsistent use of EOF
Section: 27.8.1.3 [lib.filebuf.members] Status: Ready Submitter: Vincent Leloup Date: 20 Nov 2003
--In section 27.8.1.3 [lib.filebuf.members] par6, in effects description of -basic_filebuf<charT, traits>::close(), overflow(EOF) is used twice; -should be overflow(traits::eof()). -
-Proposed resolution:
--Change overflow(EOF) to overflow(traits::eof()). -
-
-444. Bad use of casts in fstream
Section: 27.8.1 [lib.fstreams] Status: Review Submitter: Vincent Leloup Date: 20 Nov 2003
--27.8.1.7 [lib.ifstream.members] p1, 27.8.1.10 [lib.ofstream.members] p1, 27.8.1.13 [lib.fstream.members] p1 seems have same problem as exposed in LWG issue -252. +27.8.1.7 [lib.ifstream.members] p1, 27.8.1.10 [lib.ofstream.members] p1, 27.8.1.13 [lib.fstream.members] p1 seems have same problem as exposed in LWG issue +252.
Proposed resolution:
@@ -5010,7 +4350,7 @@ Change overflow(EOF) to overflow(traits::eof()).
-445. iterator_traits::reference unspecified for some iterator categories
Section: 24.3.1 [lib.iterator.traits] Status: Review Submitter: Dave Abrahams Date: 9 Dec 2003
+445. iterator_traits::reference unspecified for some iterator categories
Section: 24.3.1 [lib.iterator.traits] Status: Ready Submitter: Dave Abrahams Date: 9 Dec 2003
The standard places no restrictions at all on the reference type of input, output, or forward iterators (for forward iterators it @@ -5103,19 +4443,18 @@ so I've changed the wording to say that those types may be
Proposed resolution:
-In 24.3.1.1, after:
+In 24.3.1 [lib.iterator.traits], after:
be defined as the iterator's difference type, value type and iterator category, respectively.-In 24.3.1.1, add:
+add
In addition, the types ---iterator_traits<Iterator>::reference +iterator_traits<Iterator>::reference iterator_traits<Iterator>::pointermust be defined as the iterator's reference and pointer types, that @@ -5123,12 +4462,11 @@ is, the same type as the type of *a and a->, respectively.In 24.3.1.1, change:
+In 24.3.1 [lib.iterator.traits], change:
In the case of an output iterator, the types --iterator_traits<Iterator>::difference_type +iterator_traits<Iterator>::difference_type iterator_traits<Iterator>::value_typeare both defined as void. @@ -5137,8 +4475,7 @@ are both defined as void.to:
In the case of an output iterator, the types ---iterator_traits<Iterator>::difference_type +iterator_traits<Iterator>::difference_type iterator_traits<Iterator>::value_type iterator_traits<Iterator>::reference iterator_traits<Iterator>::pointer @@ -5146,36 +4483,26 @@ iterator_traits<Iterator>::pointer may be defined as void.In 24.5.6, change:
+In 24.5.3 [lib.istreambuf.iterator], change:
--typename traits::off_type, charT*, charT&> +typename traits::off_type, charT*, charT&>to:
--typename traits::off_type, charT*, charT> +typename traits::off_type, charT*, charT>[ -Sydney: Agreed that this is under-specified, but it's not the only -place where iterators are under-specified. We may need a more complete -review. One nice simple rule that would solve this problem: *a is -always reference by definition, and a-> is -always pointer by definition. If we do that, then we'll also -have to change a few existing iterators (e.g. istreambuf_iterator) so -they conform to that rule. We need a review of how extensive those -changes would be. Or instead of fixing pointer we could -remove it. (Which would require changing reverse_iterator as part of -that change, since the present reverse_iterator relies on the -existence of pointer.) Jeremy will supply a more detailed -analysis for Redmond. +Redmond: there was concern in Sydney that this might not be the only place +where things were underspecified and needed to be changed. Jeremy +reviewed iterators in the standard and confirmed that nothing else +needed to be changed. ]
-446. Iterator equality between different containers
Section: 24.1 [lib.iterator.requirements], 23.1 [lib.container.requirements] Status: Open Submitter: Andy Koenig Date: 16 Dec 2003
+446. Iterator equality between different containers
Section: 24.1 [lib.iterator.requirements], 23.1 [lib.container.requirements] Status: Open Submitter: Andy Koenig Date: 16 Dec 2003
What requirements does the standard place on equality comparisons between iterators that refer to elements of different containers. For example, if @@ -5199,77 +4526,8 @@ reachability. ]
-448. Random Access Iterators over abstract classes
Section: 24.1.5 [lib.random.access.iterators] Status: Ready Submitter: Dave Abrahams Date: 7 Jan 2004
--Table 76, the random access iterator requirement table, says that the -return type of a[n] must be "convertible to T". When an iterator's -value_type T is an abstract class, nothing is convertible to T. -Surely this isn't an intended restriction? -
-Proposed resolution:
--Change the return type to "convertible to T const&". -
-
-449. Library Issue 306 Goes Too Far
Section: 18.1 [lib.support.types] Status: Ready Submitter: Pete Becker Date: 15 Jan 2004
-Original text:
--The macro offsetof accepts a restricted set of type arguments in this -International Standard. type shall be a POD structure or a POD union -(clause 9). The result of applying the offsetof macro to a field that -is a static data member or a function member is undefined." -- -Revised text:
--"If type is not a POD structure or a POD union the results are undefined." -- --Looks to me like the revised text should have replaced only the second -sentence. It doesn't make sense standing alone. -
- -Proposed resolution:
-Change 18.1, paragraph 5, to:
- --The macro offsetof accepts a restricted set of type arguments in this -International Standard. If type is not a POD structure or a POD union -the results are undefined. The result of applying the offsetof macro -to a field that is a static data member or a function member is -undefined." --
-452. locale::combine should be permitted to generate a named locale
Section: 22.1.1.3 [lib.locale.members] Status: Open Submitter: Bill Plauger Date: 30 Jan 2004
--template<class Facet> - locale::combine(const locale&) const; ---is obliged to create a locale that has no name. This is overspecification -and overkill. The resulting locale should follow the usual rules -- it -has a name if the locale argument has a name and Facet is one of the -standard facets. -
- -[ - Sydney and post-Sydney (see c++std-lib-13439, c++std-lib-13440, - c++std-lib-13443): agreed that it's overkill to say that the locale - is obligated to be nameless. However, we also can't require it to - have a name. At the moment, locale names are based on categories - and not on individual facets. If a locale contains two different - facets of different names from the same category, then this would - not fit into existing naming schemes. We need to give - implementations more freedom. Bill will provide wording. -]
- -Proposed resolution:
-Rationale:
-
-453. basic_stringbuf::seekoff need not always fail for an empty stream
Section: 27.7.1.3 [lib.stringbuf.virtuals] Status: Open Submitter: Bill Plauger Date: 30 Jan 2004
-- pos_type basic_stringbuf::seekoff(off_type, ios_base::seekdir, +453. basic_stringbuf::seekoff need not always fail for an empty stream
Section: 27.7.1.3 [lib.stringbuf.virtuals] Status: Ready Submitter: Bill Plauger Date: 30 Jan 2004
+pos_type basic_stringbuf::seekoff(off_type, ios_base::seekdir, ios_base::openmode);@@ -5283,16 +4541,28 @@ an effective offset of zero.
]Proposed resolution:
+Change the sentence from:
++For a sequence to be positioned, if its next pointer (either +gptr() or pptr()) is a null pointer, the positioning operation +fails. ++ +to:
+ ++For a sequence to be positioned, if its next pointer (either +gptr() or pptr()) is a null pointer and the new offset newoff +is nonzero, the positioning operation fails. +
-454. basic_filebuf::open should accept wchar_t names
Section: 27.8.1.3 [lib.filebuf.members] Status: Open Submitter: Bill Plauger Date: 30 Jan 2004
-- basic_filebuf *basic_filebuf::open(const char *, ios_base::open_mode); +454. basic_filebuf::open should accept wchar_t names
Section: 27.8.1.3 [lib.filebuf.members] Status: Ready Submitter: Bill Plauger Date: 30 Jan 2004
+basic_filebuf *basic_filebuf::open(const char *, ios_base::open_mode);should be supplemented with the overload:
-- basic_filebuf *basic_filebuf::open(const wchar_t *, ios_base::open_mode); +basic_filebuf *basic_filebuf::open(const wchar_t *, ios_base::open_mode);@@ -5305,8 +4575,60 @@ actual filename. provide wording.]
Proposed resolution:
+ +Change from:
+++ +basic_filebuf<charT,traits>* open( + const char* s, + ios_base::openmode mode ); ++ ++Effects: If is_open() != false, returns a null pointer. +Otherwise, initializes the filebuf as required. It then +opens a file, if possible, whose name is the NTBS s ("as if" +by calling std::fopen(s,modstr)).
+to:
+ +++ +basic_filebuf<charT,traits>* open( + const char* s, + ios_base::openmode mode ); + +basic_filebuf<charT,traits>* open( + const wchar_t* ws, + ios_base::openmode mode ); ++ ++Effects: If is_open() != false, returns a null pointer. +Otherwise, initializes the filebuf as required. It then +opens a file, if possible, whose name is the NTBS s ("as if" +by calling std::fopen(s,modstr)). +For the second signature, the NTBS s is determined from the +WCBS ws in an implementation-defined manner. +
+ ++(NOTE: For a system that "naturally" represents a filename +as a WCBS, the NTBS s in the first signature may instead +be mapped to a WCBS; if so, it follows the same mapping +rules as the first argument to open.) +
+Rationale:
++Slightly controversial, but by a 7-1 straw poll the LWG agreed to move +this to Ready. The controversy was because the mapping between wide +names and files in a filesystem is implementation defined. The +counterargument, which most but not all LWG members accepted, is that +the mapping between narrow files names and files is also +implemenation defined.
-455. cerr::tie() and wcerr::tie() are overspecified
Section: 27.3 [lib.iostream.objects] Status: Open Submitter: Bill Plauger Date: 30 Jan 2004
+455. cerr::tie() and wcerr::tie() are overspecified
Section: 27.3 [lib.iostream.objects] Status: Ready Submitter: Bill Plauger Date: 30 Jan 2004
Both cerr::tie() and wcerr::tie() are obliged to be null at program startup. This is overspecification and overkill. It is both traditional @@ -5315,11 +4637,27 @@ whenever an error message is written. This behavior should at least be permitted if not required. Same for wcerr::tie().
Proposed resolution:
+ +Add to the description of cerr:
++After the object cerr is initialized, cerr.tie() returns &cout. +Its state is otherwise the same as required for basic_ios<char>::init +(lib.basic.ios.cons). ++ +Add to the description of wcerr:
+ ++After the object wcerr is initialized, wcerr.tie() returns &wcout. +Its state is otherwise the same as required for basic_ios<wchar_t>::init +(lib.basic.ios.cons). ++[Sydney: straw poll (3-1): we should require, not just - permit, cout and cerr to be tied on startup. Bill will provide - wording.]
+ permit, cout and cerr to be tied on startup. Pre-Redmond: Bill will + provide wording.]
-456. Traditional C header files are overspecified
Section: 17.4.1.2 [lib.headers] Status: Open Submitter: Bill Plauger Date: 30 Jan 2004
+456. Traditional C header files are overspecified
Section: 17.4.1.2 [lib.headers] Status: Open Submitter: Bill Plauger Date: 30 Jan 2004
The C++ Standard effectively requires that the traditional C headers (of the form <xxx.h>) be defined in terms of the newer C++ @@ -5403,7 +4741,7 @@ declaring C names in headers.
Proposed resolution:
-457. bitset constructor: incorrect number of initialized bits
Section: 23.3.5.1 [lib.bitset.cons] Status: Review Submitter: Dag Henriksson Date: 30 Jan 2004
+457. bitset constructor: incorrect number of initialized bits
Section: 23.3.5.1 [lib.bitset.cons] Status: Ready Submitter: Dag Henriksson Date: 30 Jan 2004
The constructor from unsigned long says it initializes "the first M bit positions to the corresponding bit values in val. M is the smaller @@ -5417,14 +4755,14 @@ uses to hold the value. Thus, the first M bit position above is not guaranteed to have any corresponding bit values in val.
Proposed resolution:
-In 23.3.5.1 [lib.bitset.cons] paragraph 2, change "M is the smaller of +
In 23.3.5.1 [lib.bitset.cons] paragraph 2, change "M is the smaller of N and the value CHAR_BIT * sizeof (unsigned long). (249)" to "M is the smaller of N and the number of bits in - the value representation (section 3.9 [basic.types]) of unsigned + the value representation (section 3.9 [basic.types]) of unsigned long."
-458. 24.1.5 contains unintented limitation for operator-
Section: 24.1.5 [lib.random.access.iterators] Status: Open Submitter: Daniel Frey Date: 27 Feb 2004
+458. 24.1.5 contains unintented limitation for operator-
Section: 24.1.5 [lib.random.access.iterators] Status: Open Submitter: Daniel Frey Date: 27 Feb 2004
In 24.1.5 [lib.random.access.iterators], table 76 the operational semantics for the expression "r -= n" are defined as "return r += -n". @@ -5453,7 +4791,7 @@ operational semantics for this column to:
-459. Requirement for widening in stage 2 is overspecification
Section: 22.2.2.1.2 [lib.facet.num.get.virtuals] Status: Open Submitter: Martin Sebor Date: 16 Mar 2004
+459. Requirement for widening in stage 2 is overspecification
Section: 22.2.2.1.2 [lib.facet.num.get.virtuals] Status: Open Submitter: Martin Sebor Date: 16 Mar 2004
When parsing strings of wide-character digits, the standard requires the library to widen narrow-character "atoms" and compare the widened atoms against the characters that are being parsed. @@ -5471,8 +4809,7 @@ widen() allows, i.e. without making a virtual call to do_narrow every time, is as follows:
-- inline char ctype<wchar_t>::narrow (wchar_t wc, char dflt) const +inline char ctype<wchar_t>::narrow (wchar_t wc, char dflt) const { const unsigned wi = unsigned (wc); @@ -5498,11 +4835,11 @@ drastic. Existing implementations with the exception of libstdc++ currently already use narrow() so the impact of the change on programs would presumably be isolated to just a single implementation. Further, since narrow() is not required to translate alternate wide digit -representations such as those mentioned in issue 303 to +representations such as those mentioned in issue 303 to their narrow equivalents (i.e., the portable source characters '0' through '9'), the change does not necessarily imply that these alternate digits would be treated as ordinary digits and accepted as -part of numbers during parsing. In fact, the requirement in 22.2.1.1.2 [lib.locale.ctype.virtuals], p13 forbids narrow() to translate an alternate +part of numbers during parsing. In fact, the requirement in 22.2.1.1.2 [lib.locale.ctype.virtuals], p13 forbids narrow() to translate an alternate digit character, wc, to an ordinary digit in the basic source character set unless the expression (ctype<charT>::is(ctype_base::digit, wc) == true) holds. This in @@ -5531,7 +4868,7 @@ technique to perform the comparison: if it the source and destination types are the same
-460. Default modes missing from basic_fstream member specifications
Section: 27.8.1 [lib.fstreams] Status: New Submitter: Ben Hutchings Date: 1 Apr 2004
+460. Default modes missing from basic_fstream member specifications
Section: 27.8.1 [lib.fstreams] Status: Ready Submitter: Ben Hutchings Date: 1 Apr 2004
The second parameters of the non-default constructor and of the open member function for basic_fstream, named "mode", are optional @@ -5542,10 +4879,21 @@ constructor declaration has the "explicit" function-specifier implying that it is intended to be callable with one argument.
Proposed resolution:
--
+In 27.8.1.12 [lib.fstream.cons], change
+explicit basic_fstream(const char* s, ios_base::openmode mode); ++to
+explicit basic_fstream(const char* s, + ios_base::openmode mode = ios_base::in|ios_base::out); ++In 27.8.1.13 [lib.fstream.members], change
+void open(const char*s, ios_base::openmode mode); ++to
+ void open(const char*s, + ios_base::openmode mode = ios_base::in|ios_base::out);
-461. time_get hard or impossible to implement
Section: 22.2.5.1 [lib.locale.time.get] Status: New Submitter: Bill Plauger Date: 23 Mar 2004
+461. time_get hard or impossible to implement
Section: 22.2.5.1.2 [lib.locale.time.get.virtuals] Status: Review Submitter: Bill Plauger Date: 23 Mar 2004
Template time_get currently contains difficult, if not impossible, requirements for do_date_order, do_get_time, and do_get_date. All require @@ -5580,10 +4928,59 @@ and maximum latitude, we can permit an implementation to parse whatever %x or %X generates, but we shouldn't require it.
Proposed resolution:
+ +In the description:
+iter_type do_get_time(iter_type s, iter_type end, ios_base& str, + ios_base::iostate& err, tm* t) const; +++2 Effects: Reads characters starting at suntil it has extracted those +struct tm members, and remaining format characters, used by +time_put<>::put to produce the format specified by 'X', or until it +encounters an error or end of sequence.
+ +change: 'X'
+ +to: "%H:%M:%S"
+ + +In the description:
+iter_type do_get_date(iter_type s, iter_type end, ios_base& str, + ios_base::iostate& err, tm* t) const; +++4 Effects: Reads characters starting at suntil it has extracted those +struct tm members, and remaining format characters, used by +time_put<>::put to produce the format specified by 'x', or until it +encounters an error. +
+ ++change: used by time_put<>::put to produce the format +specified by 'x', or until it encounters an error. +
+ +to: used by time_put<>:: put to produce one of the +following formats, or until it encounters an error. The format depends +on the value returned by date_order() as follows: +
+date_order() format + + no_order "%m/%d/%y" + dmy "%d/%m/%y" + mdy "%m/%d/%y" + ymd "%y/%m/%d" + ydm "%y/%d/%m" ++ +[Redmond: agreed that this is a real problem. The solution is + probably to match C99's parsing rules. Bill provided wording. +]
+
-462. Destroying objects with static storage duration
Section: 3.6.3 [basic.start.term], 18.3 [lib.support.start.term] Status: New Submitter: Bill Plauger Date: 23 Mar 2004
+462. Destroying objects with static storage duration
Section: 3.6.3 [basic.start.term], 18.3 [lib.support.start.term] Status: Open Submitter: Bill Plauger Date: 23 Mar 2004
3.6.3 Termination spells out in detail the interleaving of static destructor calls and calls to functions registered with atexit. To @@ -5606,13 +5003,21 @@ suites. At the very least, we should permit deferred destruction even if we don't require it.
Proposed resolution:
+ +[If this is to be changed, it should probably be changed by CWG. + At this point, however, the LWG is leaning toward NAD. Implementing + what the standard says is hard work, but it's not impossible and + most vendors went through that pain years ago. Changing this + behavior would be a user-visible change, and would break at least + one real application.]
+
-463. auto_ptr usability issues
Section: 20.4.5 [lib.auto.ptr] Status: New Submitter: Rani Sharoni Date: 7 Dec 2003
+463. auto_ptr usability issues
Section: 20.4.5 [lib.auto.ptr] Status: Open Submitter: Rani Sharoni Date: 7 Dec 2003
-TC1 CWG DR #84 effectively made the template%lt;class Y> operator auto_ptr%lt;Y>() +TC1 CWG DR #84 effectively made the template<class Y> operator auto_ptr<Y>() member of auto_ptr (20.4.5.3/4) obsolete.
@@ -5621,15 +5026,14 @@ The sole purpose of this obsolete conversion member is to enable copy initialization base from r-value derived (or any convertible types like cv-types) case: --#include %lt;memory> +#include <memory> using std::auto_ptr; struct B {}; struct D : B {}; -auto_ptr%lt;D> source(); -int sink(auto_ptr%lt;B>); +auto_ptr<D> source(); +int sink(auto_ptr<B>); int x1 = sink( source() ); // #1 EDG - no suitable copy constructor@@ -5652,14 +5056,13 @@ conversions and in fact current compilers conform to DR #84. I was surprised to discover that the obsolete conversion member actually has negative impact of the copy initialization base from l-value derived case: --auto_ptr%lt;D> dp; +auto_ptr<D> dp; int x2 = sink(dp); // #2 EDG - more than one user-defined conversion appliesI'm sure that the original intention was allowing this initialization using -the template%lt;class Y> auto_ptr(auto_ptr%lt;Y>& a) constructor (20.4.5.1/4) but +the template<class Y> auto_ptr(auto_ptr<Y>& a) constructor (20.4.5.1/4) but since in this copy initialization it's merely user defined conversion (UDC) and the obsolete conversion member is UDC with the same rank (for the early overloading stage) there is an ambiguity between them. @@ -5669,16 +5072,14 @@ overloading stage) there is an ambiguity between them. Removing the obsolete member will have impact on code that explicitly invokes it:
--int y = sink(source().operator auto_ptr%lt;B>()); +int y = sink(source().operator auto_ptr<B>());IMHO no one ever wrote such awkward code and the reasonable workaround for #1 is:
--int y = sink( auto_ptr%lt;B>(source()) ); +int y = sink( auto_ptr<B>(source()) );@@ -5698,9 +5099,8 @@ no candidates.
I also found exception safety issue with auto_ptr related to auto_ptr_ref:
--int f(auto_ptr%lt;B>, std::string); -auto_ptr%lt;B> source2(); +int f(auto_ptr<B>, std::string); +auto_ptr<B> source2(); // string constructor throws while auto_ptr_ref // "holds" the pointer @@ -5711,18 +5111,18 @@ int x4 = f(source2(), "xyz"); // #4 The theoretic execution sequence that will cause a leak:-
- call auto_ptr%lt;B>::operator auto_ptr_ref%lt;B>()
+- call auto_ptr<B>::operator auto_ptr_ref<B>()
- call string::string(char const*) and throw
According to 20.4.5.3/3 and 20.4.5/2 the auto_ptr_ref conversion member -returns auto_ptr_ref%lt;Y> that holds *this and this is another defect since -the type of *this is auto_ptr%lt;X> where X might be different from Y. Several -library vendors (e.g. SGI) implement auto_ptr_ref%lt;Y> with Y* as member which +returns auto_ptr_ref<Y> that holds *this and this is another defect since +the type of *this is auto_ptr<X> where X might be different from Y. Several +library vendors (e.g. SGI) implement auto_ptr_ref<Y> with Y* as member which is much more reasonable. Other vendor implemented auto_ptr_ref as defectively required and it results with awkward and catastrophic code: -int oops = sink(auto_ptr%lt;B>(source())); // warning recursive on all control +int oops = sink(auto_ptr<B>(source())); // warning recursive on all control paths
@@ -5741,7 +5141,7 @@ constructor template with sole propose to generate ill-formed, diagnostic required, instance for const auto_ptr arguments during instantiation of declaration. This special constructor will not be instantiated for other types which is achievable using 14.8.2/2 (SFINAE). Having this constructor -in hand makes the constructor template%lt;class Y> auto_ptr(auto_ptr%lt;Y> const&) +in hand makes the constructor template<class Y> auto_ptr(auto_ptr<Y> const&) legitimate since the actual argument can't be const yet non const r-value are acceptable. @@ -5756,18 +5156,17 @@ that involve const auto_ptr arguments.The proposed auto_ptr interface:
--namespace std { - template%lt;class X> class auto_ptr { +namespace std { + template<class X> class auto_ptr { public: typedef X element_type; // 20.4.5.1 construct/copy/destroy: explicit auto_ptr(X* p=0) throw(); auto_ptr(auto_ptr&) throw(); - template%lt;class Y> auto_ptr(auto_ptr%lt;Y> const&) throw(); + template<class Y> auto_ptr(auto_ptr<Y> const&) throw(); auto_ptr& operator=(auto_ptr&) throw(); - template%lt;class Y> auto_ptr& operator=(auto_ptr%lt;Y>) throw(); + template<class Y> auto_ptr& operator=(auto_ptr<Y>) throw(); ~auto_ptr() throw(); // 20.4.5.2 members: @@ -5778,9 +5177,9 @@ namespace std { void reset(X* p=0) throw(); private: - template%lt;class U> + template<class U> auto_ptr(U& rhs, typename -unspecified_error_on_const_auto_ptr%lt;U>::type = 0); +unspecified_error_on_const_auto_ptr<U>::type = 0); }; }@@ -5790,12 +5189,11 @@ One compliant technique to implement the unspecified_error_on_const_auto_ptr helper class is using additional private auto_ptr member class template like the following: --template%lt;typename T> struct unspecified_error_on_const_auto_ptr; +template<typename T> struct unspecified_error_on_const_auto_ptr; -template%lt;typename T> -struct unspecified_error_on_const_auto_ptr%lt;auto_ptr%lt;T> const> -{ typedef typename auto_ptr%lt;T>::const_auto_ptr_is_not_allowed type; }; +template<typename T> +struct unspecified_error_on_const_auto_ptr<auto_ptr<T> const> +{ typedef typename auto_ptr<T>::const_auto_ptr_is_not_allowed type; };@@ -5811,19 +5209,18 @@ verifying this with core language experts.
Remove section 20.4.5.3
Change 20.4.5/2 to read something like: -Initializing auto_ptr%lt;X> from const auto_ptr%lt;Y> will result with unspecified +Initializing auto_ptr<X> from const auto_ptr<Y> will result with unspecified ill-formed declaration that will require unspecified diagnostic.
Change 20.4.5.1/4,5,6 to read:
-template%lt;class Y> auto_ptr(auto_ptr%lt;Y> const& a) throw();+template<class Y> auto_ptr(auto_ptr<Y> const& a) throw();4 Requires: Y* can be implicitly converted to X*.
-5 Effects: Calls const_cast%lt;auto_ptr%lt;Y>&>(a).release().
+5 Effects: Calls const_cast<auto_ptr<Y>&>(a).release().
6 Postconditions: *this holds the pointer returned from a.release().
Change 20.4.5.1/10
--template%lt;class Y> auto_ptr& operator=(auto_ptr%lt;Y> a) throw(); +template<class Y> auto_ptr& operator=(auto_ptr<Y> a) throw();10 Requires: Y* can be implicitly converted to X*. The expression delete @@ -5838,11 +5235,10 @@ as before and accept non-const auto_ptr& since they have effect on the form of the implicitly declared copy constructor and copy assignment operator of class that contains auto_ptr as member per 12.8/5,10:
--struct X { +struct X { // implicit X(X&) // implicit X& operator=(X&) - auto_ptr%lt;D> aptr_; + auto_ptr<D> aptr_; };@@ -5854,24 +5250,25 @@ current auto_ptr behavior.Dave Abrahams encouraged me to suggest fallback implementation in case that my suggestion that involves removing of auto_ptr_ref will not be accepted. -In this case removing the obsolete conversion member to auto_ptr%lt;Y> and +In this case removing the obsolete conversion member to auto_ptr<Y> and 20.4.5.3/4,5 is still required in order to eliminate ambiguity in legal cases. The two constructors that I suggested will co exist with the current members but will make auto_ptr_ref obsolete in initialization contexts. auto_ptr_ref will be effective in assignment contexts as suggested in DR #127 and I can't see any serious exception safety issues in those cases -(although it's possible to synthesize such). auto_ptr_ref%lt;X> semantics will +(although it's possible to synthesize such). auto_ptr_ref<X> semantics will have to be revised to say that it strictly holds pointer of type X and not -reference to an auto_ptr for the favor of cases in which auto_ptr_ref%lt;Y> is -constructed from auto_ptr%lt;X> in which X is different from Y (i.e. assignment +reference to an auto_ptr for the favor of cases in which auto_ptr_ref<Y> is +constructed from auto_ptr<X> in which X is different from Y (i.e. assignment from r-value derived to base).
Proposed resolution:
--
+[Redmond: punt for the moment. We haven't decided yet whether we + want to fix auto_ptr for C++-0x, or remove it and replace it with + move_ptr and unique_ptr.]
-464. Suggestion for new member functions in standard containers
Section: 23.2.4 [lib.vector], 23.3.1 [lib.map] Status: New Submitter: Thorsten Ottosen Date: 12 May 2004
+464. Suggestion for new member functions in standard containers
Section: 23.2.4 [lib.vector], 23.3.1 [lib.map] Status: Review Submitter: Thorsten Ottosen Date: 12 May 2004
To add slightly more convenience to vector<T> and map<Key,T> we should consider to add
@@ -5884,7 +5281,9 @@ semantics: if( empty() ) return 0; else return buffer_;
Rationale:
Proposed resolution:
--
+In 23.2.4 [lib.vector], add the following to the vector + synopsis after "element access" and before "modifiers":
+// [lib.vector.data] data access + pointer data(); + const_pointer data() const; ++ +
Add a new subsection of 23.2.4 [lib.vector]:
+++ +23.2.4.x vector data access
+pointer data(); + const_pointer data() const; ++Returns: A pointer such that [data(), data() + size()) is a valid + range that contains the same elements as [begin(), end()).
+Complexity: Constant time.
+Throws: Nothing.
+
In 23.3.1 [lib.map], add the following to the map +synopsis immediately after the line for operator[]:
+T& at(const key_type& x); + const T& at(const key_type& x) const; ++ +
Add the following to 23.3.1.2 [lib.map.access]:
+++ +T& at(const key_type& x); + const T& at(const key_type& x) const; ++ +Returns: A reference to the element whose key is equivalent + to x, if such an element is present in the map.
+Throws: out_of_range if no such element is present.
+ +
Rationale:
+Neither of these additions provides any new functionality but the + LWG agreed that they are convenient, especially for novices. The + exception type chosen for at, std::out_of_range, + was chosen to match vector::at.
Section: 17.4.1.2 [lib.headers] Status: New Submitter: Steve Clamage Date: 3 Jun 2004
+Section: 17.4.1.2 [lib.headers] Status: Review Submitter: Steve Clamage Date: 3 Jun 2004
C header <iso646.h> defines macros for some operators, such as not_eq for !=.
-Section 17.4.1.2 [lib.headers] "Headers" says that except as noted in +
Section 17.4.1.2 [lib.headers] "Headers" says that except as noted in clauses 18 through 27, the <cname> C++ header contents are the same as the C header <name.h>. In particular, table 12 lists <ciso646> as a C++ header.
@@ -5917,18 +5356,26 @@ of <iso646.h>.I don't find any normative text to support C.2.2.2.
Proposed resolution:
--Add a section somewhere (clause 18? clause 22?) that says <iso646.h> and <ciso646> are empty for C++. -
+Add to section 17.4.1.2 Headers [lib.headers] a new paragraph after + paragraph 6 (the one about functions must be functions):
+ +++ +Identifiers that are keywords or operators in C++ shall not be defined +as macros in C++ standard library headers. +[Footnote:In particular, including the standard header <iso646.h> +or <ciso646> has no effect.
+
[post-Redmond: Steve provided wording.]
+Section: 21.3.1 [lib.string.cons] Status: New Submitter: Daniel Frey Date: 10 Jun 2004
+Section: 21.3.1 [lib.string.cons] Status: Open Submitter: Daniel Frey Date: 10 Jun 2004
Today, my colleagues and me wasted a lot of time. After some time, I found the problem. It could be reduced to the following short example:
-- #include <string> +#include <string> int main() { std::string( 0 ); }@@ -5943,10 +5390,15 @@ argument. This would catch the above code at compile time and would not ambiguate any other legal ctors.Proposed resolution:
--
+[Redmond: No great enthusiasm for doing this. If we do, + however, we want to do it for all places that take charT* + pointers, not just the single-argument constructor. The other + question is whether we want to catch this at compile time (in which + case we catch the error of a literal 0, but not an expression whose + value is a null pointer), at run time, or both.]
+
-467. char_traits::lt(), compare(), and memcmp()
Section: 21.1.3.1 [lib.char.traits.specializations.char] Status: New Submitter: Martin Sebor Date: 28 Jun 2004
+467. char_traits::lt(), compare(), and memcmp()
Section: 21.1.3.1 [lib.char.traits.specializations.char] Status: Review Submitter: Martin Sebor Date: 28 Jun 2004
Table 37 describes the requirements on Traits::compare() in terms of @@ -5969,28 +5421,31 @@ imposed by Table 37 on compare() when char is signed.
Change 21.1.3.1, p6 from
-++The two-argument members assign, eq, and lt are defined identically to the built-in operators =, ==, and < respectively. -to
-- The two-argument members assign and eq are defined identically - to the built-in operators = and == respectively. The two-argument - member lt is defined identically to the built-in operator < for - type unsigned char. -++ The two-argument member assign is defined identically to + the built-in operators = and == respectively. The two + argument members eq and lt are defined identically to + the built-in operators == and < for type unsigned char. ++ +[Redmond: The LWG agreed with this general direction, but we + also need to change eq to be consistent with this change. + Post-Redmond: Martin provided wording.]
-468. unexpected consequences of ios_base::operator void*()
Section: 27.4.4.3 [lib.iostate.flags] Status: New Submitter: Martin Sebor Date: 28 Jun 2004
+468. unexpected consequences of ios_base::operator void*()
Section: 27.4.4.3 [lib.iostate.flags] Status: Review Submitter: Martin Sebor Date: 28 Jun 2004
The program below is required to compile but when run it typically produces unexpected results due to the user-defined conversion from std::cout or any object derived from basic_ios to void*.
-- #include <cassert> +#include <cassert> #include <iostream> int main () @@ -6012,20 +5467,16 @@ the value need not be valid.Specifically, change in [lib.ios] the signature of
-- operator void*() const; +operator void*() const;to
-- operator unspecified_pointer_type () const; +operator unspecified_pointer_type () const;and change [lib.iostate.flags], p1 from
-- operator void*() const; +operator void*() const;to
-- operator unspecified_pointer_type() const; +operator unspecified_pointer_type() const; -1- Returns: If fail() then a null pointer; otherwise some non-null but not necessarily valid pointer to indicate success. @@ -6036,8 +5487,10 @@ the value need not be valid. Footnote 1: A pointer-to-member might be one such suitable type.+[Redmond: 5-4 straw poll in favor of doing this.]
+
-469. vector<bool> ill-formed relational operators
Section: 23.2.5 [lib.vector.bool] Status: New Submitter: Martin Sebor Date: 28 Jun 2004
+469. vector<bool> ill-formed relational operators
Section: 23.2.5 [lib.vector.bool] Status: Ready Submitter: Martin Sebor Date: 28 Jun 2004
The overloads of relational operators for vector<bool> specified @@ -6053,7 +5506,7 @@ Remove all overloads of overloads of relational operators for vector<bool> from [lib.vector.bool].
-470. accessing containers from their elements' special functions
Section: 23 [lib.containers] Status: New Submitter: Martin Sebor Date: 28 Jun 2004
+470. accessing containers from their elements' special functions
Section: 23 [lib.containers] Status: Open Submitter: Martin Sebor Date: 28 Jun 2004
The standard doesn't prohibit the destructors (or any other special @@ -6071,8 +5524,7 @@ in some surprising (i.e., undefined) behavior.
Add to Container Requirements the following new paragraph:
-- Unless otherwise specified, the behavior of a program that +Unless otherwise specified, the behavior of a program that invokes a container member function f from a member function g of the container's value_type on a container object c that called g from its mutating member function h, is undefined. @@ -6080,12 +5532,16 @@ in some surprising (i.e., undefined) behavior. c.h() from v.g() called from c.f(), is undefined.+[Redmond: This is a real issue, but it's probably a clause 17 + issue, not clause 23. We get the same issue, for example, if we + try to destroy a stream from one of the stream's callback functions.]
+ +
-471. result of what() implementation-defined
Section: 18.6.1 [lib.exception] Status: New Submitter: Martin Sebor Date: 28 Jun 2004
+471. result of what() implementation-defined
Section: 18.6.1 [lib.exception] Status: Open Submitter: Martin Sebor Date: 28 Jun 2004
[lib.exception] specifies the following:
-- exception (const exception&) throw(); +exception (const exception&) throw(); exception& operator= (const exception&) throw(); -4- Effects: Copies an exception object. @@ -6115,15 +5571,27 @@ then I believe the standard ought to be clarified to spell out exactly what the effects are on the copy (i.e., after the copy ctor was called). + +[Redmond: Yes, this is fuzzy. The issue of derived classes is + fuzzy too.]
+Proposed resolution:
-472. Missing "Returns" clause in std::equal_range
Section: 25.3.3.3 [lib.equal.range] Status: New Submitter: Prateek R Karandikar Date: 29 Feb 1900
+472. Missing "Returns" clause in std::equal_range
Section: 25.3.3.3 [lib.equal.range] Status: Review Submitter: Prateek R Karandikar Date: 29 Feb 1900
There is no "Returns:" clause for std::equal_range, which returns non-void.
Proposed resolution:
+In 25.3.3.3 [lib.equal.range], change
++ Effects: Finds the largest subrange [i, j)... ++to
++ Returns: The largest subrange [i, j)... +
-473. underspecified ctype calls
Section: 22.2.1.1 [lib.locale.ctype] Status: New Submitter: Martin Sebor Date: 1 Jul 2004
+473. underspecified ctype calls
Section: 22.2.1.1 [lib.locale.ctype] Status: New Submitter: Martin Sebor Date: 1 Jul 2004
Most ctype member functions come in two forms: one that operates on a single character at a time and another form that operates @@ -6192,8 +5660,7 @@ Add two paragraphs immediately after 22.2.1.1 [lib.locale.ctype], p2, with the following text:
-- -3- Each ctype non-virtual member function that comes in two forms, +-3- Each ctype non-virtual member function that comes in two forms, one that takes a range of elements of char_type, and another that takes just a single element of char_type, is required to call the corresponding form of the virtual member function @@ -6219,7 +5686,7 @@ p2, with the following text:
-474. confusing Footnote 297
Section: 27.6.2.5.4 [lib.ostream.inserters.character] Status: New Submitter: Martin Sebor Date: 1 Jul 2004
+474. confusing Footnote 297
Section: 27.6.2.5.4 [lib.ostream.inserters.character] Status: New Submitter: Martin Sebor Date: 1 Jul 2004
I think Footnote 297 is confused. The paragraph it applies to seems @@ -6232,7 +5699,7 @@ value of widen(c) is otherwise. I propose to strike the Footnote.
-475. May the function object passed to for_each modify the elements of the iterated sequence?
Section: 25.1.1 [lib.alg.foreach] Status: New Submitter: Stephan T. Lavavej, Jaakko Jarvi Date: 9 Jul 2004
+475. May the function object passed to for_each modify the elements of the iterated sequence?
Section: 25.1.1 [lib.alg.foreach] Status: New Submitter: Stephan T. Lavavej, Jaakko Jarvi Date: 9 Jul 2004
It is not clear whether the function object passed to for_each is allowed to modify the elements of the sequence being iterated over. @@ -6291,7 +5758,7 @@ We suggest that the standard be clarified to explicitly allow the function objec passed to for_each modify its argument.
Proposed resolution:
-Add the following sentence to the Effects in 25.1.1 [lib.alg.foreach]:
+Add the following sentence to the Effects in 25.1.1 [lib.alg.foreach]:
"f may apply non-constant functions through the dereferenced iterators @@ -6300,7 +5767,7 @@ of a mutable iterator (24.1)."
-476. Forward Iterator implied mutability
Section: 24.1.3 [lib.forward.iterators] Status: New Submitter: Dave Abrahams Date: 9 Jul 2004
+476. Forward Iterator implied mutability
Section: 24.1.3 [lib.forward.iterators] Status: New Submitter: Dave Abrahams Date: 9 Jul 2004
24.1/3 says:
@@ -6329,12 +5796,11 @@ relationship between forward iterator and output iterator. requirements.
-477. Operator-> for const forward iterators
Section: 24.1.3 [lib.forward.iterators] Status: New Submitter: Dave Abrahams Date: 11 Jul 2004
+477. Operator-> for const forward iterators
Section: 24.1.3 [lib.forward.iterators] Status: New Submitter: Dave Abrahams Date: 11 Jul 2004
The Forward Iterator requirements table contains the following:
-- expression return type operational precondition +expression return type operational precondition semantics ========== ================== =========== ========================== a->m U& if X is mutable, (*a).m pre: (*a).m is well-defined. @@ -6360,15 +5826,14 @@ of referenced members. But Paragraph 11 of [lib.iterator.requirements] says:AFAICT if we need the second line at all, it should read the same as the first line.
-Related issue: 478
+Related issue: 478
Proposed resolution:
-478. Should forward iterator requirements table have a line for r->m?
Section: 24.1.3 [lib.forward.iterators] Status: New Submitter: Dave Abrahams Date: 11 Jul 2004
+478. Should forward iterator requirements table have a line for r->m?
Section: 24.1.3 [lib.forward.iterators] Status: New Submitter: Dave Abrahams Date: 11 Jul 2004
The Forward Iterator requirements table contains the following:
-- expression return type operational precondition +expression return type operational precondition semantics ========== ================== =========== ========================== a->m U& if X is mutable, (*a).m pre: (*a).m is well-defined. @@ -6408,8 +5873,312 @@ answer is to changein paragraph 11 of [lib.iterator.requirements].
-Related issue: 477
+Related issue: 477
Proposed resolution:
+
+479. Container requirements and placement new
Section: 23.1 [lib.container.requirements] Status: New Submitter: Herb Sutter Date: 1 Aug 2004
+Nothing in the standard appears to make this program ill-formed:
+ +struct C { + void* operator new( size_t s ) { return ::operator new( s ); } + // NOTE: this hides in-place and nothrow new + }; + + int main() { + vector<C> v; + v.push_back( C() ); + } ++ +Is that intentional? We should clarify whether or not we intended + to require containers to support types that define their own special + versions of operator new.
+ +Proposed resolution:
+
+480. unary_function and binary_function should have protected nonvirtual destructors
Section: 20.3.1 [lib.base] Status: New Submitter: Joe Gottman Date: 19 Aug 2004
+The classes std::unary_function and std::binary_function are both +designed to be inherited from but contain no virtual functions. This +makes it too easy for a novice programmer to write code like +binary_function<int, int, int> *p = new plus<int>; delete p;
+ +There are two common ways to prevent this source of undefined +behavior: give the base class a public virtual destructor, or give it +a protected nonvirtual destructor. Since unary_function and +binary_function have no other virtual functions, (note in particular +the absence of an operator()() ), it would cost too much to give them +public virtual destructors. Therefore, they should be given protected +nonvirtual destructors.
+Proposed resolution:
+Change Paragraph 20.3.1 of the Standard from
+template <class Arg, class Result> + struct unary_function { + typedef Arg argument_type; + typedef Result result_type; + }; + + template <class Arg1, class Arg2, class Result> + struct binary_function { + typedef Arg1 first_argument_type; + typedef Arg2 second_argument_type; + typedef Result result_type; + }; ++ +to
+template <class Arg, class Result> + struct unary_function { + typedef Arg argument_type; + typedef Result result_type; + protected: + ~unary_function() {} + }; + + template <class Arg1, class Arg2, class Result> + struct binary_function { + typedef Arg1 first_argument_type; + typedef Arg2 second_argument_type; + typedef Result result_type; + protected: + ~binary_function() {} + }; ++
+481. unique's effects on the range [result, last)
Section: 25.2.8 [lib.alg.unique] Status: New Submitter: Andrew Koenig Date: 30 Aug 2004
++The standard says that unique(first, last) "eliminates all but the +first element from every consecutive group of equal elements" in +[first, last) and returns "the end of the resulting range". So a +postcondition is that [first, result) is the same as the old [first, +last) except that duplicates have been eliminated. +
+ +What postconditions are there on the range [result, last)? One + might argue that the standard says nothing about those values, so + they can be anything. One might also argue that the standard + doesn't permit those values to be changed, so they must not be. + Should the standard say something explicit one way or the other?
+ +Proposed resolution:
++
+
+482. Swapping pairs
Section: 20.2.2 [lib.pairs], 25.2.2 [lib.alg.swap] Status: New Submitter: Andrew Koenig Date: 14 Sep 2004
+(Based on recent comp.std.c++ discussion)
+ +Pair (and tuple) should specialize std::swap to work in terms of +std::swap on their components. For example, there's no obvious reason +why swapping two objects of type pair<vector<int>, +list<double> > should not take O(1).
+Proposed resolution:
+
+483. Heterogeneous equality and EqualityComparable
Section: 25.1 [lib.alg.nonmodifying], 25.2 [lib.alg.modifying.operations] Status: New Submitter: Peter Dimov Date: 20 Sep 2004
+c++std-lib-14262
+ +[lib.alg.find] requires T to be EqualityComparable:
+ +template <class InputIterator, class T> + InputIterator find(InputIterator first, InputIterator last, + const T& value); ++ ++However the condition being tested, as specified in the Effects +clause, is actually *i == value, where i is an InputIterator. +
+ ++The two clauses are in agreement only if the type of *i is T, but this +isn't necessarily the case. *i may have a heterogeneous comparison +operator that takes a T, or a T may be convertible to the type of *i. +
+ +Further discussion (c++std-lib-14264): this problem affects a + number of algorithsm in clause 25, not just find. We + should try to resolve this problem everywhere it appears.
+Proposed resolution:
+ +[lib.alg.find]:
++ Remove [lib.alg.find]/1. ++ +[lib.alg.count]:
++ Remove [lib.alg.count]/1. ++ +[lib.alg.search]:
++ Remove "Type T is EqualityComparable (20.1.1), " from [lib.alg.search]/4. ++ +[lib.alg.replace]:
+ +++ ++ Remove [lib.alg.replace]/1. + Replace [lb.alg.replace]/2 with: +
+ ++ For every iterator i in the range [first, last) for which *i == value + or pred(*i) holds perform *i = new_value. ++ ++ Remove the first sentence of /4. + Replace the beginning of /5 with: +
+ ++ For every iterator i in the range [result, result + (last - + first)), assign to *i either... ++ +(Note the defect here, current text says assign to i, not *i).
+[lib.alg.fill]:
+ +++ ++ Remove "Type T is Assignable (23.1), " from /1. + Replace /2 with: +
+ ++ For every iterator i in the range [first, last) or [first, first + n), + perform *i = value. ++[lib.alg.remove]:
++ Remove /1. + Remove the first sentence of /6. ++ +Rationale:
+Specifying EqualityComparable is redundant where it's correct, + because the equality requirements are implicit in the descriptions + of the algorithms' behavior.
+
+484. Convertible to T
Section: 24.1.1 [lib.input.iterators] Status: New Submitter: Chris Date: 16 Sep 2004
+From comp.std.c++:
+ ++I note that given an input iterator a for type T, +then *a only has to be "convertable to T", not actually of type T. +
+ +Firstly, I can't seem to find an exact definition of "convertable to T". +While I assume it is the obvious definition (an implicit conversion), I +can't find an exact definition. Is there one?
+ +Slightly more worryingly, there doesn't seem to be any restriction on +the this type, other than it is "convertable to T". Consider two input +iterators a and b. I would personally assume that most people would +expect *a==*b would perform T(*a)==T(*b), however it doesn't seem that +the standard requires that, and that whatever type *a is (call it U) +could have == defined on it with totally different symantics and still +be a valid inputer iterator.
+ +Is this a correct reading? When using input iterators should I write +T(*a) all over the place to be sure that the object i'm using is the +class I expect?
+ +This is especially a nuisance for operations that are defined to be + "convertible to bool". (This is probably allowed so that + implementations could return say an int and avoid an unnessary + conversion. However all implementations I have seen simply return a + bool anyway. Typical implemtations of STL algorithms just write + things like while(a!=b && *a!=0). But strictly + speaking, there are lots of types that are convertible to T but + that also overload the appropriate operators so this doesn't behave + as expected.
+ +If we want to make code like this legal (which most people seem to + expect), then we'll need to tighten up what we mean by "convertible + to T".
+ +Proposed resolution:
++
+
+485. output iterator insufficently constrained
Section: 24.1.2 [lib.output.iterators] Status: New Submitter: Chris Date: 13 Oct 2004
++The note on 24.1.2 Output iterators insufficently limits what can be +performed on output iterators. While it requires that each iterator is +progressed through only once and that each iterator is written to only +once, it does not require the following things:
+ +Note: Here it is assumed that x is an output iterator of type X which +has not yet been assigned to.
+ +a) That each value of the output iterator is written to: +The standard allows: +++x; ++x; ++x; +
+ ++b) That assignments to the output iterator are made in order +X a(x); ++a; *a=1; *x=2; is allowed +
+ ++c) Chains of output iterators cannot be constructed: +X a(x); ++a; X b(a); ++b; X c(b); ++c; is allowed, and under the current +wording (I believe) x,a,b,c could be written to in any order. +
+ +I do not believe this was the intension of the standard?
+Proposed resolution:
+Add to the note:
+ +"The values of an output iterator must be assigned to in the order they +are generated. It is undefined to progress forward more than once from a +value of an output iterator which has not yet been assigned."
+ +This is I believe the intension of the existing text. The "progress +forward once" is allowed so that "*r++=t" is allowed. It may be prefered +to instead allow something more along the lines of:
+ +"The values of an output iterator must be assigned to in the order they +are generated. With the exception of '*r++=t', an iterator must always +be assigned to before it is incremented".
+
+486. min/max CopyConstructible requirement is too strict
Section: 25.3.7 [lib.alg.min.max] Status: New Submitter: Dave Abrahams Date: 13 Oct 2004
+A straightforward implementation of these algorithms does not need to +copy T.
+Proposed resolution:
+drop the the words "and CopyConstructible" from paragraphs 1 and 4
+
+487. Allocator::construct is too limiting
Section: 20.1.5 [lib.allocator.requirements] Status: New Submitter: Dhruv Matani Date: 17 Oct 2004
++The standard's version of allocator::construct(pointer, +const_reference) severely limits what you can construct using this +function. Say you can construct a socket from a file descriptor. Now, +using this syntax, I first have to manually construct a socket from +the fd, and then pass the constructed socket to the construct() +function so it will just to an uninitialized copy of the socket I +manually constructed. Now it may not always be possible to copy +construct a socket eh! So, I feel that the changes should go in the +allocator::construct(), making it: +
+template<typename T> + struct allocator{ + template<typename T1> + void construct(pointer T1 const& rt1); + }; ++ ++Now, the ctor of the class T which matches the one that takes a T1 can +be called! Doesn't that sound great? +
+Proposed resolution:
++
----- End of document -----
- - +