根据 C++1y/C++14 N3690,变量模板特化的类型是否必须与主模板的类型相同?
template<int x>
char y = f(x);
template<>
double y<42> = g();
如果是这样,是否有可能以某种方式使主要的未定义?
template<int x>
???? y = ???; // undefined
template<>
double y<42> = g();
草案中的哪些内容?
类模板的等效功能是:
template<int x>
struct S
{
static char y;
};
template<>
struct S<42>
{
static double y;
};
和
template<int x>
struct S; // undefined
template<>
struct S<42>
{
static double y;
};
最佳答案
变量模板特化的类型是否必须与主模板的类型相同?
不,变量模板的显式(或部分)特化可以指定与隐式实例化所隐含的类型不同的类型。在为 Clang 实现该功能时,我们发现规范没有要求在这种情况下匹配类型的规则,我们将此问题提交给 C++ 核心工作组,并确认此遗漏是故意的。
是否有可能以某种方式使主要的未定义?
如果不指定类型,就不可能声明主变量模板——没有任何语法允许这样的事情。
草案中的哪些内容?
这两者都被省略了——没有要求类型匹配的规则,也没有声明没有类型的变量模板的语法。所以我不能指出标准的任何特定部分并说“这就是规则不存在的地方”。
如果您有权访问 C++ 标准委员会的反射器,请参阅以 core-23901 开头的线程以进行讨论。
关于C++1y/C++14 : Variable Template Specialization?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19108345/