Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
318 views
in Technique[技术] by (71.8m points)

c++ - C++1y/C++14: Variable Template Specialization?

According to C++1y/C++14 N3690, does the type of a variable template specialization have to be the same as the type of the primary template?

template<int x>
char y = f(x);

template<>
double y<42> = g();

And if so, is it possible to leave the primary undefined somehow?

template<int x>
???? y = ???; // undefined

template<>
double y<42> = g();

Where is this covered in the draft?

The equivalent functionality for a class template would be:

template<int x>
struct S
{
    static char y;
};

template<>
struct S<42>
{
    static double y;
};

and

template<int x>
struct S; // undefined

template<>
struct S<42>
{
    static double y;
};
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

Does the type of a variable template specialization have to be the same as the type of the primary template?

No, an explicit (or partial) specialization of a variable template can specify a type different from the type that would be implied by an implicit instantiation. When implementing the feature for Clang, we discovered that the specification had no rule requiring the type to match in this case, and we brought the issue to the C++ core working group, where it was confirmed that this omission was intentional.

Is it possible to leave the primary undefined somehow?

It is not possible to declare the primary variable template without specifying a type -- there is no syntax that would allow such a thing.

Where is this covered in the draft?

Both of these are covered by omission -- there is no rule requiring the types to match, and there is no syntax for declaring a variable template without a type. So I can't point you at any particular part of the standard and say "here's where the rule isn't".

If you have access to the C++ standard committee's reflectors, see the thread starting with core-23901 for the discussion of this.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

2.1m questions

2.1m answers

60 comments

57.0k users

...