On 11/14/2014 01:01 PM, David Blaikie wrote:> On Fri, Nov 14, 2014 at 4:23 AM, Larry Evans <cppljev...@suddenlink.net> > wrote: > >> On 11/14/2014 12:48 AM, David Blaikie wrote: >>> My guess is that the proposal was written assuming a certain >> implementation >>> of constexpr that never panned out. >>> >>> It looks like both GCC and Clang expect constexpr member variables to be >>> explicitly marked static: >>> >>> const.cpp:5:19: error: non-static data member 'f' declared 'constexpr' >>> constexpr foo f{}; >>> ^ >>> >>> (is GCC 4.9's diagnostic - for a simple non-template constexpr member >> variable) >>> >> That's sad because, as n3651 says on pp. 2-3: >> >> The main problems with “static data member” are: >> >> • they require “duplicate” declarations: once inside the class >> template, once outside the class template to provide the “real” >> definition in case the constants is odr-used. >> >> • programmers are both miffed and confused by the necessity of >> providing twice the same declaration. By contrast, “ordinary” >> constant declarations do not need duplicate declarations. >> > > I don't think this is referring to the need to write "static" in a static > member variable template declaration. > > This is referring to the workaround (In the absence of static variables) of > using a class template with a nested static data member - pointing out that > when you write it that way (see the example near this workaround > description) you have to write the class, the variable declaration, and the > variable definition. Whereas with a plain non-member variable template you > don't need separate declaration/definition - the variable template (like a > function template) is the declaration+definition all in one. >
So, if the keyword, static, *is* used, a separate definition *outside* of the class (IOW, in, I think the terminology is, "in namespace scope") is needed. In contrast, if keyword static *is not* used, the separate definition is not required ( even though the variable is still a static member) ? > >> Also, the clang status page: >> >> http://clang.llvm.org/cxx_status.html >> >> reference n3651 below the section title: >> >> C++14 implementation status >> >> Hence, I thought that's what clang implemented. >> > > Ah, here's the wording that's important: > > "A variable template at class scope is a static data member template." in > 14 paragraph 1. > > (sorry, I'd been looking in the static member parts of the spec, not the > variable template parts, which have this special case) > > It looks like this just hasn't been implemented - Larisse (CC'd) did the > initial variable template implementation. Perhaps she can tell us if that > was a more recent change, whether it's planned to be fixed, or a bug in the > spec etc. > The reponse to my comment here: http://en.cppreference.com/w/Talk:cpp/language/variable_template says: the examples in the standard have an error, mentioned _here_ where _here_ links to: http://stackoverflow.com/questions/21474111/variable-template-at-class-scope/21482264?noredirect=1#comment32627331_21482264 which is, essentially, the question posed in my OP to this thread. In addition, the comments to that SO post contain: _The committee is aware that the wording for variable templates needs some help in various places_ which links to: https://groups.google.com/a/isocpp.org/forum/#!topic/std-proposals/ZTw3W3vjWWs which I'm still trying to digest :(, but it seems to indicate the variable template meaning is ambiguous; hence, one can't say clang has a bug in its implementation of variable templates. -regards, Larry [snip] _______________________________________________ cfe-users mailing list cfe-users@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/cfe-users