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

标签 c++ templates c++14

根据 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/

相关文章:

c++ - 编译器在 Boost::ASIO 写入和 unistd 写入之间混合

c++ - 作为可变参数模板的结构化参数

c++ - 给定类型的模板化中间数组

c++ - 通用 lambda、继承和尾随返回类型 : is this valid code?

java - 在 C++ 中有类似的东西吗

c++ - 读取二进制文件并正确使用流迭代器

c++ - 将 int8_t 转换为 int,以便我可以对其执行操作

c# - 将通用代码从 C# 转换为模板 C++

javascript - ng-include 包含的 Angular 指令模板

c++ - std::discrete_distribution 指定范围的随机数