[cfe-users] variable template within class produces non-static data member cannot be constexpr

Larry Evans cppljevans at suddenlink.net
Fri Nov 14 04:23:46 PST 2014


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.

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.

In addition, the latest standard *draft*:

  https://isocpp.org/files/papers/N3797.pdf

contains the n3651 matrix_constants example on p. 313.

Is there some more current standards document which requires the
static qualifier on variable templates within a class?

TIA.

-regards,
Larry

> On Thu, Nov 13, 2014 at 8:38 PM, Larry Evans <cppljevans at suddenlink.net>
> wrote:
> 
>> The following code:
>>
>> //{=======================================
>> #include <type_traits>
>> struct variable_template
>> {
>>     template <int Value>
>>     std::integral_constant<int,Value> constexpr
>>   value{}
>>     ;
>> };
>> #include <iostream>
>> #include <iomanip>
>> int main()
>> {
>>     std::cout<<
>>       variable_template::
>>       value<1>()<<std::endl;
>>     return 0;
>> }
>> //}=======================================
[snip]





More information about the cfe-users mailing list