Doc. no. | N4423 |
Date: | 2015-04-10 |
Project: | Programming Language C++ |
Reply to: | Ville Voutilainen <ville.voutilainen@gmail.com> |
Revised 2015-04-10 at 16:04:35 UTC
Reference ISO/IEC IS 14882:2003(E)
Also see:
This document contains only evolution issues which have been closed by the Evolution Working Group as duplicates or not defects. That is, issues which have a status of Dup or NAD. See the Evolution Active Issues List active issues and more information. See the Evolution Complete Issues List for issues considered accepted extensions. The introductory material in that document also applies to this document.
Section: 20.9 [meta] Status: NAD Submitter: Dean Michael Berris Opened: 2012-09-18 Last modified: 2015-04-02
View other active issues in [meta].
View all other issues in [meta].
View all issues with NAD status.
Discussion:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3410.pdfTo be handled by the Reflection Study Group (SG7).
Discussed by SG7 in Chicago, SG7 doesn't think the paper is going into the right direction and the paper author has acknowledged so.
Section: 5.19 [expr.const] Status: NAD Submitter: Dave Abrahams Opened: 2012-10-16 Last modified: 2015-04-02
View all other issues in [expr.const].
View all issues with NAD status.
Discussion:
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.
Bristol 2013: Gregor thought that wrt general direction, constexpr is specifically not to have a constexpr-only model, and this issue would go into the opposite direction. NAD.
Section: 13 [over] Status: NAD Submitter: Nevin Liber Opened: 2012-10-19 Last modified: 2015-04-02
View all issues with NAD status.
Discussion:
struct Silly { template<class... Ts> Silly(Ts&&...) {} }; int main() { Silly s; Silly t(s); // Silly::Silly(Ts &&...) [Ts = <Silly &>] const Silly u; Silly v(u); // calls Silly::Silly(Silly const&) }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&.
Bristol 2013: Sutton and Gregor proposed various work-arounds, like additional overloads and constraints. Stroustrup asked whether having a copying template have different semantics from a copy constructor isn't an error, and Gregor explained that tuples run into that issue and they have different semantics for the template. The submitter is encouraged to write a paper, and practical examples are desirable.
The EWG decided to close this issue as a NAD in Chicago 2013.
Section: 7.2 [dcl.enum] Status: NAD Submitter: Jeffrey Yasskin Opened: 2012-10-20 Last modified: 2015-04-02
View all issues with NAD status.
Discussion:
In Beman's filesystem code, I found the following problem, which he didn't see because he's been building with MSVC 10: A scoped enum defined at
is used likeif (opts & copy_options::skip_existing) ++ct;
athttps://github.com/Beman/filesystem-proposal/blob/master/src/operations.cpp#L773.
This causes an error like:../../../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.Bristol 2013: Stroustrup pointed out that the existing behavior is deliberately trying to avoid supporting anything like this, in order to play safe. He further explained that allowing member functions for scoped enums has been attempted but the attempts failed. Gregor pointed out that not all scoped enums have a zero value, so doing it generally is hard. Stroustrup said he would want to have member functions for enums. Yasskin said he's not interested in writing a paper. Other people are invited to do so.
Section: 12.3 [class.conv] Status: NAD Submitter: Jeffrey Yasskin Opened: 2012-10-24 Last modified: 2015-04-02
View all issues with NAD status.
Discussion:
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.
Bristol 2013: The group doesn't see this as something that we should pursue, and thinks it's a design error and users are advised just not to do this. NAD.
Section: 5 [expr] Status: NAD Submitter: Alisdair Meredith Opened: 2012-10-28 Last modified: 2015-04-02
View all other issues in [expr].
View all issues with NAD status.
Discussion:
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:
function<void()> a; function<void()> b; assert(a != b); // does not compile assert(a ^^ b); // would compile, and assert!
Bristol 2013: EWG doesn't believe reopening this discussion, it's been tried previously and it's unlikely that a new round would lead to anything. NAD.
Section: 5.17 [expr.ass] Status: NAD Submitter: Mike Miller Opened: 2012-11-02 Last modified: 2015-04-02
View all issues with NAD status.
Discussion:
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.
In Bristol 2013: EWG thinks the answer _is_ just "why would you use the { } form in a case like this anyway?". NAD.
Section: 11.3 [class.friend] Status: NAD Submitter: Gabriel Dos Reis Opened: 2012-11-10 Last modified: 2015-04-02
View all issues with NAD status.
Discussion:
When we went from C++98 to C++03 we made nested classes implicitly friend of their enclosing classes. We seem to have missed doing the same for local classes defined at member functions scopes.
Mike Miller explained:Hmm. I think that's already covered by 11p2:
A member of a class can also access all the names to which the class has access. A local class of a member function may access the same names that the member function itself may access.By the definition of "private" in 11p1, a nested class has access to the private members of the containing class; a member function of the nested class therefore also has access to the private members of the containing class; a local class of such a member function has the same access as the member function; and a member function of the local class has the same access as the local class, the same access as the containing member function, and the same access as the nested class.
Section: 17 [library] Status: NAD Submitter: Nevin Liber Opened: 2013-02-05 Last modified: 2015-04-02
View all other issues in [library].
View all issues with NAD status.
Discussion:
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.
Bristol 2013: NAD. The operators have no opportunity for substitution failure.
Section: 8.5.1 [dcl.init.aggr] Status: NAD Submitter: Michael Price Opened: 2013-01-21 Last modified: 2015-04-02
View all other issues in [dcl.init.aggr].
View all issues with NAD status.
Discussion:
http://open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3526.html
Bristol 2013: Stroustrup thought that the proposal is too aggressive and removes structure, and thought that the existing limitations are deliberate. Stroustrup and Sutton also pointed out that there are existing matrix types that deduce the shape of the matrix from the initializers, and this change would break such existing code. No recommendation to move forward, considered NAD.
Section: 13.5 [over.oper] Status: NAD Submitter: Walter Brown Opened: 2013-03-13 Last modified: 2015-04-02
View other active issues in [over.oper].
View all other issues in [over.oper].
View all issues with NAD status.
Discussion:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3746.pdf
http://open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3553.pdf
Bristol 2013:
Point d in "the basics": left operand is a modifiable lvalue expression and the right operand a modifiable glvalue. Why the asymmetry? JC: it's because the operator returns the lhs.
Bjarne: do we really need a new operator?
Matt: Maybe. swap() has annoying ADL problems.
Daveed: does it really solve them? The operator will still be found by ADL. Matt: maybe, since this would use an intrinsic in place of the general std::swap template.
Bjarne: But swap() isn't going away because of backward compatibility, so now we'll have swap() and operator:=:. "Probably a good idea if we had a time machine". Introducing a new operator, it has to be really central and helpful. If it got us out of our swap problem it might be good enough, but it isn't. Libraries aren't going to stop calling swap and if they did then all the specialized swap functions people have written wouldn't get invoked. Problems are real, but the benefits it would have (i.e. what problem it would actually solve) aren't sufficiently explained. Too likely that swap and :=: would coexist indefinitely and that all the problems of swap would persist.
General agreement that this is a real problem but that it's not clear why this would solve them. We will not proceed with this.
No recommendation to move forward, considered NAD.
Section: 12.8 [class.copy] Status: NAD Submitter: Walter Brown Opened: 2013-03-12 Last modified: 2015-04-02
View all other issues in [class.copy].
View all issues with NAD status.
Discussion:
http://open-std.org/JTC1/SC22/WG21/docs/papers/2014/n3839.pdf
http://open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3578.pdf
Bristol 2013: Considered NAD, too early for such a breaking change after C++11, breaks valid programs that use C++11 semantics (defaulted destructor outside class definition, otherwise generated members, used with various smart pointer members).
Issaquah 2014: Brown pointed out that he wasn't in Bristol. Vandevoorde explained that users rely on the current semantics, and that there's existing code in various library headers that would break with this change, and users cannot necessarily fix that breakage due to licensing issues that prevent modifying such code. Voutilainen pointed out that while there are cases where not suppressing copy operations when a destructor is declared leads to incorrect code, there's also quite many cases where the code is correct. Brown opined that he doesn't want to close the door for this kind of changes forever, but EWG didn't see a practical way to be able to enable this rule. The issue therefore stays closed.
Section: 5.3.4 [expr.new] Status: NAD Submitter: Thomas Koeppe Opened: 2013-04-22 Last modified: 2015-04-02
View all other issues in [expr.new].
View all issues with NAD status.
Discussion:
Basically, I would like to file a Defect Report: The global array placement new, as described in C++11, 5.3.4/10-12, is unusable. The reason for this is that the standard allows the operator to consume an arbitrary amount of memory, which is impossible for the user to learn, and thus impossible to provide. The fix is to remove the ability for placement-new to require more size than required for the array itself to the allocation function.
Current wording, in 5.3.4/12 says:
new(2,f) T[5] results in a call of operator new[](sizeof(T)*5+y,2,f)Here, x and y are non-negative unspecified values representing array allocation overhead; the result of the new-expression will be offset by this amount from the value returned by operator new[].
Unfortunately, the presence of "y" means that it is impossible to pass a usable address to placement-array-new:
void * addr = std::malloc(?); new (addr) T[10];
In the above, it is impossible to know the required argument for malloc, since the placement-new can ask for sizeof(T) * 10 + y bytes for any y.
The fix would be to remove the possiblity of placement-new requiring more memory for arrays, i.e. insert into 5.3.4/10 something like:
A new-expression passes the amount of space requested to the allocation function as the first argument of type std::size_t. That argument shall be no less than the size of the object being created; it may be greater than the size of the object being created only if the object is an array and the new-expression is a default new-expression.
What do you think? I don't think the change could break anything, since nothing could be using placement-array-new at the moment, and it makes sense that a placement version doesn't require extra space, since the caller already knows the array size and has to perform destruction manually anyway.
Mike Miller points out the following:
You're not the first one to notice a problem with this; see
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#476
To summarize, CWG agreed that that's a problem but felt that the resolution was more appropriately handled in EWG, since it requires evaluations of the tradeoffs of various possible options to address it. Your approach, for example, focuses on the placement operator new provided by the library, which simply runs the constructor(s) on a previously-allocated buffer. However, that's not the only use of the placement new syntax, which can pass arbitrary arguments to allocation functions that actually do allocate memory, and it's not clear that none of those will need to add padding similar to the way the standard allocation function does.
In Chicago 2013, EWG deemed this NAD. Remarks from the discussion: "The problem is in trying to use array new to put an array into pre-existing storage. We don't need to use array new for that; just construct them." and "You can find what padding was used after the fact, because new returns a pointer to the start of the first element of the array. But that can happen only after UB. "
Section: 6.6.3 [stmt.return] Status: NAD Submitter: Richard Smith Opened: 2013-07-02 Last modified: 2015-04-02
View all other issues in [stmt.return].
View all issues with NAD status.
Discussion:
A thread on std-discussion[1] has highlighted that
return E;
where E has type void is valid in a function with a return type of 'void' but not valid in a constructor or destructor. There is implementation variance here, and we have examples of code which very reasonably wants to use "return E;" in a constructor, from within the expansion of a macro, and fails on some compilers due to this rule. The inconsistency between "return;" and "return void();" seems extremely jarring here, and I'd like to propose that we treat this as a defect.
(I'm not suggesting that we treat constructors and destructors as having a return type of 'void', as was suggested on the thread on std-discussion, but I'm not opposed to it.)
[1] https://groups.google.com/a/isocpp.org/forum/#!topic/std-discussion/ehqGBMsswjk
Discussed in Chicago 2013 (as the NB comment FI 6), no consensus to make a change, NB comment rejected, the issue is NAD. Vandevoorde said this rubs him the wrong way, because this suggests that a constructor returns nothing even though that's not the case.
Section: 5.2 [expr.post] Status: NAD Submitter: Herb Sutter Opened: 2013-06-06 Last modified: 2015-04-02
View all issues with NAD status.
Discussion:
Example:
#include <string> using namespace std; int main() { const string{ "Hello" }; // 1: error "xyzzy" + const string{"Hello"}; // 2: error typedef const string const_string; const_string{"Hello"}; // 3: ok "xyzzy" + const_string{"Hello"}; // 4: ok unsigned long{0}; // 5: error 42ul + unsigned long{0}; // 6: error typedef unsigned long unsigned_long; unsigned_long{0}; // 7: ok 42ul + unsigned_long{0}; // 8: ok }Sutter says:
The issue is "lines 1 to 8 below should all work." That they don't is just because of the reason Nikolay pointed out using line 1 below as an example:
> The error is purely syntactic: 'const string' is not a simple-type-specifier
Richard Smith points out the following:
I can't comment on what was noticed in the abstract, but I was certainly aware of all the above cases. And the rules make sense to me: function-style casts are supposed to be function-style, and the above error cases doesn't look like a function call (and not just because you've put the paren next to the type in the function-call-like cases, and added an extra space in the other cases!).
I'm not sure exactly what rules you're proposing, but I hope we don't make this valid:
struct A { int n; }; // ok, struct definition struct A { 0 }; // might now be an expression?
Regarding using a parenthesized type as a work-around, Sutter explained:
I think it needs to be an open EWG issue after all, because as Johannes pointed out the workaround doesn't work because it can't call multi-argument constructors, such as that
(const vector<int>)( 1, 2 )drops the 1 on the floor and creates a vector containing two zeroes. And that it doesn't work for list initializations, such as that
(unsigned int){ 1, 2, 3, 4 } // C compound literal(?!)doesn't work.
Deemed post-C++14 material in Chicago 2013. A paper is needed.
Discussed in Rapperswil 2014. The consensus of EWG is that this is not a promising direction. The workaround is to add a typedef. Closing the issue as NAD.
Section: 7.1.6.4 [dcl.spec.auto] Status: NAD Submitter: Ville Voutilainen Opened: 2013-05-02 Last modified: 2015-04-02
View all other issues in [dcl.spec.auto].
View all issues with NAD status.
Discussion:
http://open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3681.html
Discussed in Chicago 2013 (as FI 3 NB comment), no consensus to change (concerns about breaking existing code), the NB comment is rejected, the issue is NAD.
Section: 5.3 [expr.unary] Status: Dup Submitter: David Rodríguez Ibeas Opened: 2013-09-05 Last modified: 2015-04-02
View all issues with Dup status.
Discussion:
http://open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3772.pdf
The issue was discussed in Rapperswil 2014. See issue 89. Closing as a duplicate.
Section: 6.4.2 [stmt.switch] Status: NAD Submitter: Andrew Tomazos Opened: 2014-01-16 Last modified: 2015-04-02
View all other issues in [stmt.switch].
View all issues with NAD status.
Discussion:
http://open-std.org/JTC1/SC22/WG21/docs/papers/2014/n3879.pdf
Discussed in Rapperswil 2014.
Straw poll, proposal as a whole:
SF 1 - WF 1 - N 1 - WA 13 - SA 10
"break label;" + "continue label;":
SF 3 - WF 8 - N 4 - WA 9 - SA 3
Proposal not adopted, closing as NAD.
Section: 9.2 [class.mem] Status: NAD Submitter: Ville Voutilainen Opened: 2014-01-20 Last modified: 2015-04-02
View other active issues in [class.mem].
View all other issues in [class.mem].
View all issues with NAD status.
Discussion:
http://open-std.org/JTC1/SC22/WG21/docs/papers/2014/n3897.html
This paper captures the reasoning why Faisal Vali came to the conclusion that we do not want to strive for having auto-typed members.
Section: 5.3.1 [expr.unary.op] Status: NAD Submitter: Lisa Lippincott Opened: 2000-02-08 Last modified: 2015-04-02
View all issues with NAD status.
Discussion:
See Core issue 203.
Discussed in Rapperswil 2014. EWG thought that the change to existing semantics would practically require a time machine, and noted that these semantics didn't appear by accident. Changing the semantics was estimated to break too much existing code, so closing as NAD.
Section: 5.3.4 [expr.new] Status: NAD Submitter: Ben Hutchings Opened: 2004-09-14 Last modified: 2015-04-02
View all other issues in [expr.new].
View all issues with NAD status.
Discussion:
See Core issue 476.
Discussed in Rapperswil 2014. EWG thinks there's no design defect here, and suggests that a placement array new should not have such implementation-defined overhead. EWG suggests that CWG should clarify that placement array new T[n] needs n*sizeof(T) bytes of memory, and clarify that an operator delete must only be called if the corresponding operator new has been called. Ask James Dennett/Chandler Carruth for any more feedback.
Section: 5.9 [expr.rel] Status: NAD Submitter: Herb Sutter Opened: 2007-02-26 Last modified: 2015-04-02
View all other issues in [expr.rel].
View all issues with NAD status.
Discussion:
See Core issue 622.
Discussed in Rapperswil 2014. EWG finds that there's a preference for defining this, but some architectures have separate memory spaces for data/code/constants, it's non-trivial to define.
Closing as NAD. If someone wants to argue that the results of such pointer comparisons should be implementation-defined, papers are welcome.
Section: 4.11 [conv.mem] Status: NAD Submitter: UK Opened: 2009-03-03 Last modified: 2015-04-02
View all other issues in [conv.mem].
View all issues with NAD status.
Discussion:
See Core issue 822.
Discussed in Rapperswil 2014. EWG failed to find sufficient motivation for this extension, closing as NAD.
Section: 14.8.3 [temp.over] Status: NAD Submitter: Dave Abrahams Opened: 2009-07-27 Last modified: 2015-04-02
View all issues with NAD status.
Discussion:
See Core issue 947.
Issaquah 2014: EWG doesn't think it's generally implementable. A restricted implentation could be separately explored.
Section: 5.3.5 [expr.delete] Status: NAD Submitter: Herb Sutter Opened: 2010-03-10 Last modified: 2015-04-02
View all issues with NAD status.
Discussion:
See Core issue 1259.
See also the discussion thread starting at https://groups.google.com/a/isocpp.org/d/msg/std-proposals/9PxiUu0Tr1k/3gextFEMi8sJ.
Discussed in Rapperswil 2014. Dennett pointed out that this idea doesn't work with sized deallocations, which we voted in. Voutilainen pointed out that sanitizers can catch such misuses if it's undefined behaviour. Closing as NAD.
Section: 9.4.2 [class.static.data] Status: NAD Submitter: Nikolay Ivchenkov Opened: 2011-03-18 Last modified: 2015-04-02
View all issues with NAD status.
Discussion:
See Core issue 1272.
Discussed in Rapperswil 2014. Vandevoorde pointed out that there are backwards compatibility issues, Dennett pointed out that the proposed resolution makes the language more irregular and less teachable. Closing as NAD.
Section: 8.4.2 [dcl.fct.def.default] Status: Dup Submitter: Nikolay Ivchenkov Opened: 2011-12-08 Last modified: 2015-04-02
View other active issues in [dcl.fct.def.default].
View all other issues in [dcl.fct.def.default].
View all issues with Dup status.
Discussion:
See Core issue 1426.
Covered by the paper we expect from 101.
Section: 3.3.2 [basic.scope.pdecl] Status: NAD Submitter: Jason Merrill Opened: 2011-12-20 Last modified: 2015-04-02
View all issues with NAD status.
Discussion:
See Core issue 1433.
Discussed in Rapperswil 2014. EWG is sympathetic to the request, but we have significant concerns about the implementation and specification complexity. Close as NAD without prejudice. We'd need more detail. Asking vendors including Microsoft and Oracle how implementable this is for them would be a courtesy.
Section: 14.3.2 [temp.arg.nontype] Status: NAD Submitter: Daniel Krügler Opened: 2012-02-01 Last modified: 2015-04-02
View all issues with NAD status.
Discussion:
See Core issue 1451.
Discussed in Rapperswil 2014. It's not clear whether this is limited to static storage duration objects. EWG is worried about implications beyond that, and for Type<"abs">. How would this work with function templates? For (non-template) functions, a workaround is to declare the object at namespace scope, but then you don't get the lazy initialization guarantees.
Vandevoorde states that he'd like to actively vote against this. This would open special cases w.r.t. how we handle address constant expressions. 5.19 uses the same mechanism for string literals and static variables, both with no linkage. And we don't want to get into Type<"abs"> being distinct form Type<"abs">.
Section: 14.5.3 [temp.variadic] Status: NAD Submitter: Ville Voutilainen Opened: 2012-07-09 Last modified: 2015-04-02
View other active issues in [temp.variadic].
View all other issues in [temp.variadic].
View all issues with NAD status.
Discussion:
See Core issue 1519.
Issaquah 2014: there is a SFINAE work-around and Concepts Lite will make the work-around much easier.
Section: 7.1.6.4 [dcl.spec.auto] Status: NAD Submitter: Faisal Vali Opened: 2012-10-09 Last modified: 2015-04-02
View all other issues in [dcl.spec.auto].
View all issues with NAD status.
Discussion:
See Core issue 1564.
Discussed in Rapperswil 2014. EWG points out that auto deduction is moving to the opposite direction, and there's a reason why the suggested deduction isn't done, Vandevoorde showed an example of an overload set including an unconstrained template and a function taking a vector, and explained that the rules currently choose the function taking a vector, and advised against changing that. Closing as NAD.
Section: 14.5.5 [temp.class.spec] Status: NAD Submitter: Jeremiah Willcock Opened: 2012-10-19 Last modified: 2015-04-02
View all other issues in [temp.class.spec].
View all issues with NAD status.
Discussion:
See Core issue 1577.
Discussed in Rapperswil 2014. EWG considers the issue NAD, and suggests using Concepts instead.
Section: 12.4 [class.dtor] Status: NAD Submitter: Steve Clamage Opened: 2012-11-14 Last modified: 2015-04-02
View all issues with NAD status.
Discussion:
See Core issue 1586.
Discussed in Rapperswil 2014. EWG found insufficient motivation for this extension. Dennett pointed out that work-arounds are straightforward and rarely needed. Closing as NAD.
Section: 6.6.3 [stmt.return] Status: NAD Submitter: Herb Sutter Opened: 2014-04-09 Last modified: 2015-04-02
View all other issues in [stmt.return].
View all issues with NAD status.
Discussion:
http://open-std.org/JTC1/SC22/WG21/docs/papers/2014/n4074.pdf
http://open-std.org/JTC1/SC22/WG21/docs/papers/2014/n4131.html
http://open-std.org/JTC1/SC22/WG21/docs/papers/2014/n4094.html
http://open-std.org/JTC1/SC22/WG21/docs/papers/2014/n4029.pdf
Portland 2012:
Straw polls:
return as in the proposal: SF: 3 F: 2 N: 2 A: 4 SA: 5
arguments as in the proposal: SF: 2 F: 2 N: 1 A: 4 SA: 7
= {} vs. {} as in the proposal: SF: 2 F: 0 N: 4 A: 4 SA: 5
The author interprets these as dead, and does not plan to pursue this further.
Sutter reopened the issue in [c++std-ext-14770], Lavavej and Voutilainen reiterated reasons why the proposal was originally rejected. Sutter has indicated that he wishes to create a revised paper focusing on the return part, this issue is for him to reference in the paper.
Hinnant pointed to his response writeup in [c++std-ext-14883], and it was noted that [c++std-lib-34985] is also related, and mentions a paper by Krügler that would solve some of the library issues without introducing the problems Hinnant writes about.
Dimov presented a different incarnation of some of these problems in [c++std-lib-36408] "map<K,V>::emplace and explicit V constructors", and Krügler pointed out his paper solves that issue as well.
The Library issue related to Dimov's issue report is LWG 2397
Discussed in Rapperswil 2014.
Vandevoorde pointed out that he doesn't like returning an integer value and having that automatically convert to a vector. Vandevoorde said that the same arguments apply as with Josuttis's paper, because there's a difference between conversions and initializations, and that there are differences with auto. Sutter and Stroustrup suggested that the function author should know the return type of their function, so the argument that the return type isn't known doesn't hold water.
Voutilainen pointed out that there is a difference between initializations of local variables and returns, since the former allows deciding whether conversions are allowed, whereas this proposal would remove the ability to make that decision for returns.
Dennett thought that the diagnostic is not problematic because the worst kind of diagnostic is a missing diagnostic, especially ones that change a compiler error to a runtime error. Dennett asked what happens if a function vector f() {return {42};} has new semantics, and Vandevoorde warned that it seems like this would be a breaking change.
Voutilainen emphasized that this will turn compile-time errors into run-time errors, and warned about doing that lightly. Vandevoorde thought that this proposal makes code easier to write but not easier to read. Stroustrup disagreed with that point.
Voutilainen emphasized that in his opinion ownership transfer needs to stand out. Bos asked whether a compromise like return auto(2); would work. Dennett reported he has a wrap_unique() in internal use that solves the problem of having to repeat the type. Vandevoorde explained the difference between returning a value and returning a value constructed (possibly via conversion) from another value. Naumann pointed out the problems in refactoring code that returns a value but is changed to return eg. a vector, the status quo currently diagnoses those, but with this proposal, that wouldn't be the case.
Straw polls:
Proposal:
SF: 2 F: 5 N: 4 A: 3 SA: 5
Like the proposal, but just when braces are used:
SF: 3 F: 8 N: 3 A: 0 SA: 4
Sutter continued revising the proposal aiming for a solution that kicks in when braces are used. The current expectation is that the discussion will continue in Urbana, and there will be more papers related to this area.
N4094 contains a response to this proposal by Hinnant and Voutilainen.
Discussed in Urbana. EWG decided to reject the proposal due to problems it causes for the technique for transparently-explicit constructors and the problems pointed out in the response papers.
Section: 9.2 [class.mem] Status: NAD Submitter: Andrew Tomazos Opened: 2014-02-25 Last modified: 2015-04-02
View other active issues in [class.mem].
View all other issues in [class.mem].
View all issues with NAD status.
Discussion:
See http://open-std.org/JTC1/SC22/WG21/docs/papers/2014/n3955.pdf.
Discussed in Rapperswil 2014. A fairly long discussion, with lots of concerns about the motivation.
Straw polls:
Proposal as stated:
SF 1 - WF 1 - N 2 - WA 8 - SA 15
Just the virtual parts, in a new paper:
SF 4 - WF 3 - N 5 - WA 6 - SA 7
Virtual parts and some others:
SF 1 - WF 4 - N 1 - WA 9 - SA 10
We're done for this meeting. We don't actually encourage this proposal to come back, but there are people who'd like improvements for virtual functions.
Closing as NAD, no consensus to adopt.
Wording available:
The paper contains the proposed wording.Section: 8.5 [dcl.init] Status: NAD Submitter: Nicolai Josuttis Opened: 2014-05-25 Last modified: 2015-04-02
View all issues with NAD status.
Discussion:
http://open-std.org/JTC1/SC22/WG21/docs/papers/2014/n4014.pdf
Discussed in Rapperswil 2014.
Voutilainen pointed out that it seems important to be able to express whether explicit operations are ok or not. Vandevoorde said there's a difference between conversions and initializations. Dennett pointed out that this proposal clashes with the direction of N3912, and showed an example of the different directions; N3912 makes copy vs. direct initialization more significant with auto, whereas the Josuttis proposal makes it less significant. Josuttis in addition mentioned that it's unfortunate that we have no guidelines for when to use explicit and when not, and that makes things difficult for the library.
Straw poll, accept the proposal:
SF: 1 F: 2 N: 6 A: 8 SA: 1
No consensus to adopt, closing as NAD.
Section: 14.5.5 [temp.class.spec] Status: NAD Submitter: Richard Smith Opened: 2013-09-19 Last modified: 2015-04-02
View all other issues in [temp.class.spec].
View all issues with NAD status.
Discussion:
See Core Issue 1754
Discussed in Rapperswil 2014. EWG consider the issue esoteric, and failed to see the motivation of the change. Closing as NAD for now, if this should be reopened, stronger motivation should be provided.
Section: 15.4 [except.spec] Status: NAD Submitter: Gabriel Dos Reis Opened: 2013-10-16 Last modified: 2015-04-02
View all issues with NAD status.
Discussion:
See Core Issue 1798
Discussed in Rapperswil 2014. EWG previously decided that exception specifications should not become part of the type system. On this issue, EWG thought that the exception specification in a template parameter is effectively ignored, and that's fine. Closing as NAD for now, if this should be reopened, a paper should be written to consider the impact of any suggested change.
Section: 5.16 [expr.cond] Status: NAD Submitter: Alexander Bock Opened: 2014-07-02 Last modified: 2015-04-02
View all other issues in [expr.cond].
View all issues with NAD status.
Discussion:
http://open-std.org/JTC1/SC22/WG21/docs/papers/2014/n4120.pdf
Discussed in Urbana. EWG discouraged the proposal as having insufficient motivation for such a language change, and didn't like the direction of adding yet another operator.
Section: 5.16 [expr.cond] Status: NAD Submitter: Eelis van der Weegen Opened: 2014-07-20 Last modified: 2015-04-02
View all other issues in [expr.cond].
View all issues with NAD status.
Discussion:
http://open-std.org/JTC1/SC22/WG21/docs/papers/2014/n4127.html
Discussed in Urbana. EWG found the motivation for the proposal insufficient.
Section: 9 [class] Status: NAD Submitter: David Krauss Opened: 2014-09-25 Last modified: 2015-04-02
View all issues with NAD status.
Discussion:
http://open-std.org/JTC1/SC22/WG21/docs/papers/2014/n4149.pdf
Discussed in Urbana. EWG didn't agree on the problem being worth solving, and thought that the paper's solution is infeasible.
Section: 19.3 [assertions] Status: NAD Submitter: David Krauss Opened: 2014-09-30 Last modified: 2015-04-02
View all issues with NAD status.
Discussion:
http://open-std.org/JTC1/SC22/WG21/docs/papers/2014/n4154.pdf
Discussed in Urbana, EWG (and a larger evening group) didn't see it feasible to modify assert.
Section: 8.3.5 [dcl.fct] Status: NAD Submitter: E. Akhgari, B. Ballo Opened: 2014-10-07 Last modified: 2015-04-02
View other active issues in [dcl.fct].
View all other issues in [dcl.fct].
View all issues with NAD status.
Discussion:
http://open-std.org/JTC1/SC22/WG21/docs/papers/2014/n4172.htm
Discussed in Urbana. EWG found various problems with the proposed approach, and didn't think it's feasible to try solving the problem, as it has been tried many times and every time it has failed.
Section: 8.3.5 [dcl.fct] Status: NAD Submitter: David Krauss Opened: 2014-10-10 Last modified: 2015-04-02
View other active issues in [dcl.fct].
View all other issues in [dcl.fct].
View all issues with NAD status.
Discussion:
http://open-std.org/JTC1/SC22/WG21/docs/papers/2014/n4221.pdf
Discussed in Urbana. EWG thought the problem is worth solving, but thought that the approach in the paper is not the right solution.
Section: 9.2 [class.mem] Status: NAD Submitter: Ville Voutilainen Opened: 2014-10-10 Last modified: 2015-04-02
View other active issues in [class.mem].
View all other issues in [class.mem].
View all issues with NAD status.
Discussion:
http://open-std.org/JTC1/SC22/WG21/docs/papers/2014/n4225.html
Discussed in Urbana. Rejected due to lack of sufficient motivation for the change.