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

Larry Evans cppljevans at suddenlink.net
Sat Nov 15 15:22:29 PST 2014


On 11/15/2014 04:12 PM, Gabriel Dos Reis wrote:> On Sat, Nov 15, 2014 at
9:13 AM, Larry Evans <cppljevans at suddenlink.net>
> wrote:
>
>> On 11/15/2014 09:51 AM, Gabriel Dos Reis wrote:
>>> On Sat, Nov 15, 2014 at 6:33 AM, Larry Evans
<cppljevans at suddenlink.net>
>>> wrote:
>>>
>>>> On 11/15/2014 06:59 AM, Gabriel Dos Reis wrote:
>>>>> On Fri, Nov 14, 2014 at 4:23 AM, Larry Evans <
>> cppljevans at suddenlink.net>
>>>>> wrote:
>>>>>
[snip]
>>>

>>> If you hate (as I do) having to put a variable in a class template
>>> just so that you can abstract over its type but then you are
>>> forced to provide a "duplicate" declaration (the real definition)
>>> outside the class, then variable templates remove that pain: they
>>> do what they were designed for.

>> That's what I was hoping.
>>
>> Maybe the problem is I'm not making my point clear enough.
>> If I understand your proposal, then the following code should
>> compile without error when:
>>   !defined(USE_STATIC) && !defined(DUPLICATE_DECLARATION)
>> yet, with clang 3.5, it only compiles with both these
>> macros are define.
>>
>> Is clang wrong?
>>
>
> You still have variable template as class member in your original example,
> so you have to  obey the rules of class members...

> Note that your original example was (also) missing the keyword "static" --
> the C++ object model does not permit non-static data member
> templates.

But the matrix_constants example on p. 4 of n3651 also is
missing the keyword "static".  The paragraph above that
example says:

  A variable template at class scope is a static data member
  template.

So I'm guessing that the compiler should interpret sigma1 as
a class *static* member instead of instance member,
*despite* there being no "static" keyword *in the example*
(IOW, the sigma1 belongs to the class, not the instances of
that class.  IOW if:

  matrix_constants mc1, mc2;

there would be only one instance of matrix_constants::sigma1
shared by mc1 and mc2.  IOW, there would be no mc1.sigma1 or
mc2.sigma1, there would only be matrix_constants::sigma1.)
Is that right?

Now clang3.5 *requires* the static keyword despite it being
absent in the n3651 example.  However, *with* static,
clang3.5 also requires the "undesired" duplicate declaration
to avoid a link-time error about "missing" sigma1
definition.  Hence, clang3.5 is wrong in its implementation
of n3651, AFAICT.  Right?

-- Larry





More information about the cfe-users mailing list