The purpose of this document is to record the status of issues
which have come before the Evolution Working Group (EWG) of the INCITS PL22.16
and ISO WG21 C++ Standards Committee. Issues represent
potential defects in the ISO/IEC IS 14882:2003(E) document.

The issues in these lists are not necessarily formal ISO Defect
Reports (DR's). While some issues will eventually be elevated to
official Defect Report status, other issues will be disposed of in
other ways. See Issue Status.

This document includes [bracketed italicized notes] as a
reminder to the EWG of current progress on issues. Such notes are
strictly unofficial and should be read with caution as they may be
incomplete or incorrect. Be aware that EWG support for a particular
resolution can quickly change if new viewpoints or killer examples are
presented in subsequent discussions.

For the most current official version of this document see
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:2003(E), and be
submitted to Information Technology Industry Council (ITI), 1250 Eye
Street NW, Washington, DC 20005.

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.

How to submit an issue

Mail your issue to the author of this list.

Specify a short descriptive title. If you fail to do so, the subject line of your
mail will be used as the issue title.

If the "From" on your email is not the name you wish to appear as issue submitter,
then specify issue submitter.

Provide a brief discussion of the problem you wish to correct. Refer to the latest
working draft or standard using [section.tag] and paragraph numbers where appropriate.

Provide proposed wording. This should indicate exactly how you want the standard
to be changed. General solution statements belong in the discussion area. This
area contains very clear and specific directions on how to modify the current
draft. If you are not sure how to word a solution, you may omit this part.
But your chances of a successful issue greatly increase if you attempt wording.

It is not necessary for you to use html markup. However, if you want to, you can
<ins>insert text like this</ins> and <del>delete text like
this</del>. The only strict requirement is to communicate clearly to
the list maintainer exactly how you want your issue to look.

It is not necessary for you to specify other html font/formatting
mark-up, but if you do the list maintainer will attempt to respect your
formatting wishes (as described by html markup, or other common idioms).

It is not necessary for you to specify open date or last modified date (the date
of your mail will be used).

It is not necessary for you to cross reference other issues, but you can if you
like. You do not need to form the hyperlinks when you do, the list maintainer will
take care of that.

One issue per email is best.

Between the time you submit the issue, and the next mailing deadline
(date at the top of the Revision History), you own this issue.
You control the content, the stuff that is right, the stuff that is
wrong, the format, the misspellings, etc. You can even make the issue
disappear if you want. Just let the list maintainer know how you want
it to look, and he will try his best to accommodate you. After the
issue appears in an official mailing, you no longer enjoy exclusive
ownership of it.

Issue Status

New - The issue has not yet been
reviewed by the EWG. Any Wording available is purely a
suggestion from the issue submitter, and should not be construed as
the view of EWG.

Open - The EWG has discussed the issue
but is not yet ready to move the issue forward. There are several
possible reasons for open status:

Consensus may have not yet have been reached as to how to deal
with the issue.

Informal consensus may have been reached, but the EWG awaits
exact resolution for review.

The EWG wishes to consult additional technical experts before
proceeding.

The issue may require further study.

A Wording available for an open issue is still not be
construed as the view of EWG. Comments on the current state of
discussions are often given at the end of open issues in an italic
font. Such comments are for information only and should not be given
undue importance.

Deferred - The EWG has discussed the issue,
is not yet ready to move the issue forward, but neither does it deem the
issue significant enough to delay publishing a standard or Technical Report.
A typical deferred issue would be seeking to clarify wording that might be
technically correct, but easily mis-read.

A Wording available for a deferred issue is still not be
construed as the view of EWG. Comments on the current state of
discussions are often given at the end of open issues in an italic
font. Such comments are for information only and should not be given
undue importance.

Dup - The EWG has reached consensus that
the issue is a duplicate of another issue, and will not be further
dealt with. A Rationale identifies the duplicated issue's
issue number.

NAD - The EWG has reached consensus that
the issue is not a defect in the Standard nor is it an extension
the EWG deems acceptable.

Review - Exact resolution is now
available for review on an issue for which the EWG previously reached
informal consensus.

Ready - The EWG has reached consensus
that the issue is an extension that can go forward to Core, Library,
or a Study Group for further processing.

Resolved - The EWG has reached consensus
that the issue is a defect in or an acceptable extension to the Standard,
but the resolution adopted to
resolve the issue came via some other mechanism than this issue in the
list - typically by applying a formal paper, occasionally as a side effect
of consolidating several interacting issue resolutions into a single issue.

WP - (Working Paper) - The proposed
resolution has not been accepted as a Technical Corrigendum, but
the full WG21/PL22.16 committee has voted to apply the Defect Report's Proposed
Resolution to the working paper.

Tentatively - This is a status qualifier. The issue has
been reviewed online, or at an unofficial meeting, but not in an official meeting, and some support has been formed
for the qualified status. Tentatively qualified issues may be moved to the unqualified status
and forwarded to full committee (if Ready) within the same meeting. Unlike Ready issues, Tentatively Ready issues
will be reviewed in subcommittee prior to forwarding to full committee. When a status is
qualified with Tentatively, the issue is still considered active.

Pending - This is a status qualifier. When prepended to
a status this indicates the issue has been
processed by the committee, and a decision has been made to move the issue to
the associated unqualified status. However for logistical reasons the indicated
outcome of the issue has not yet appeared in the latest working paper.

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 EWG
is actively working on them. When the EWG 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
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 (TC1),
or are closed without action other than a Record of Response
(Resolved ). The intent of this EWG process is that
only issues which are truly defects in the Standard move to the
formal ISO DR status.

30.
[tiny] Efficient/Flexible Access to Argument Packs

There are lots of very basic manipulations that are either really hard
or impossible to do with argument packs unless you use something that
causes a big recursive template instantiation, which is expensive at
compile-time and can cause bad error messages. I want to be able to
index argument packs with integral constant expressions, "take" or
"drop" the first N elements of the pack, etc.

constexpr functions are crippled by the fact that they have to be valid
at runtime. Things that are tantalizingly close but you can't quite do
include returning a type that depends on the /value/ of a function
parameter:

constexpr auto ptr_array(int N) -> int(*)[N]
{ ... }

If we would allow for constexpr functions that can only be evaluated at
compile time, we'd be able to do compile-time computation in a much less
template-heavy way.

The problem is that users expect the copy constructor to be called in both situations.
Note: you do not need variadics for this; it made the example smaller. Also, this issue existed in C++03, but rarely happened in practice because templated parameters were usually declared const T&.

../../../libs/filesystem/src/operations.cpp:773:9: error: value of
type 'boost::filesystem::copy_options' is not contextually convertible
to 'bool'

I believe it makes sense to define a contextual conversion to bool for
certain scoped enumerations, but I don't see a way to do it. I do see
a way to overload & to return bool, but that seems to prevent using &
to remove bits from a value, which shouldn't always be prevented.

We have a hash function for built-in types and for some standard library types, but we don't have automatically generated hash<> specializations for user-defined types like

struct my_type {
int x;
std::string y;
vector<int> z;
};

Defining a good and efficient hash function for composite types takes a fair amount of work. One consequence is that there are a lot of user-defined types with bad hash functions floating around.
One possibility is automatically generating hash<> specializations, but that's tricky. A simpler possibility is providing tools that make it easier for users to do the right thing.

35.
[tiny] Some concise way to generate a unique, unused variable name

Sometimes we want to define a variable that's unused except for its
constructor and destructor. lock_guard<mutex> and ScopeGuard are
decent examples of this. In C++11, we have to manually name the
variable something unique. Sometimes we use _some_name_##__LINE__
(suitably wrapped so the concatenation happens after expanding
__LINE__) to try to generate unique names automatically, and gcc/clang
have an extension _some_name_##__COUNTER__

to allow multiple such variables on the same line. These are pretty
verbose and not convenient for casual use.
Haskell allows _ (underscore) to stand in for a variable that's not
going to be used. Googlemock defines testing::_ to mean "don't care"
as an argument, which is similar but not identical.

36.
[tiny] no way to say "prefer this implicit conversion over that"

If a type has two implicit conversions, and I call a function with overloads for both target types, there's no way to disambiguate short of writing the conversion explicitly or adding another overload. It would be nice to be able to extend the partial order on conversions.

37.
[tiny] Logical xor operator

I have a low-priority issue for adding the (neglected) logical-xor operator, ^^.
This has traditionally been dismissed as un-necessary, as it is equivalent to boolean operator!=, and there is no short-circuiting benefit to justify adding it.
However, contextual conversions to 'bool' are handled specially for logical operators, and in that context it would be completing a hole in the language.
I wish I had a better example, but pulling from the standard library:

38.
[tiny] Core issue 1542

In Portland, CWG categorized a number of issues as "extension," which
I presume you
will automatically look at for potential EWG involvement once the new
revision of the
issues list is out. I did want to mention one issue for which we will
be resolving part
and referring the other part to EWG: issue 1542 raises the question of
whether the
narrowing rules make sense for a compound assignment, e.g.,

char c;
c += {1};

CWG addressed a similar issue (1078) for an ordinary assignment and
decided that,
although the narrowing error was annoying in that case, it wasn't
worth the effort to
change the language because the workaround was simply to add a cast. In this
case, however, there's no way to avoid the error (no place to put the
cast). I think we'd
be happy with a revision of the narrowing rules that addressed both
this case and the
one in 1078; maybe the answer is just "why would you use the { } form
in a case like
this anyway?"
The Core issue link here.

40.
[tiny] Relax the allocator requirements on vector so that the small object optimization is allowed

I had submitted a DR (727) about this in October 2008 - and it was
classified as an extension - I wonder if Spertus' DR (1077) that was
also classified as an extension should be considered along with this
one.
14.7.3 [temp.expl.spec] paragraph 2 requires that explicit
specializations of member templates be declared in namespace scope,
not in the class definition. This restriction does not apply to
partial specializations of member templates; that is,

Since a conforming implementation can return a null pointer for vc.data() when vc.size() == 0. I don't see any reason to disallow this construct, especially since it takes a Standards expert to see that this is possibly illegal, but not std::string(vc.data(), vc.data() + vc.size()).
This is likely to go onto the LEWG's plate.

Wording available:

Requires: n < npos and either s shall not be a null pointer or n == 0.

43.
[tiny] simultaneous iteration with new-style for syntax

The new-style 'for' syntax allows us to dispense with administrative
iterator declarations when iterating over a single seuqence.
The burden and noise remain, however, when iterating over two or more
sequences simultaenously. We should extend the syntax to allow that.
E.g. one should be able to write:

44.
[tiny] variadic bind

As more variadic functions work their way into my C++ code, I'm getting increasingly annoyed that there isn't a variadic bind.
There is a tiny bit of annoyance on exactly what to use. There seems to me to be 2 sensible choices (other people may have others)

I haven't personally found a need for multiple ranges of variadic arguments, or more complicated chopping (such as getting the last few arguments), and I'd want to hopefully keep this simple if possible!

I'd like to have an is_range<T, R = void> type trait, which derives from true_type if and only if T can be used in range-based for, and *__begin is convertible to R (where R == void means don't bother checking this condition).

In C++11, all the containers, pair, tuple, etc. always have the relation operators defined for them (==, !=, <, >, <=, >=), even if the contained type does not have them; they just fail to compile if one tries to invoke them. It would be better if those operators were SFINAEed out, so that generic code can then detect it and apply alternate strategies.

A use case I've have for this is when holding stateless objects that don't normally have the relation operators defined for them.

This is a proposal to allow specializing templates from within a different namespace. The motivation is that when we declare a new class, it is natural to want to provide associated template specializations. For example, it is really painful that whenever I declare a class, I need to leave my namespace and enter namespace std just to specialize std::less as shown below