GNU C ++和Clang中的模板实例化

武功

像在Clang的模板实例化(3.8)和GNU C ++(4.9)的规则看起来是不一样的。这是一个例子:

#include <cstddef>

template <bool>
class Assert {
  Assert();          // private constructor for Assert<false>
};

template <>
class Assert<true> { // implicit public constructor for Assert<true>
};

template <size_t N>
class A {
};

template <class T, size_t N>
T foo(A<N>) {
  return T(N - 1);
}

template <class T>
T foo(A<0>) {        // foo is not defined for N=0
  Assert<false>();
  return T(0);
}

int main(int argc, char **argv) {
  foo<int>(A<3>());
  return 0;
}

这个最小的示例显示了一个模板函数,foo函数在类型T和自然数上进行了概括N未为定义此函数N=0,因此,Assert如果使用这种方法,我想使用该类来表示编译器错误。

该代码被GNU编译器(以及Visual C ++ 2015)接受,但是Clang提供了“调用类的私有构造函数Assert<false>”错误。

那么谁是对的?正如我所看到的,没有的要求foo<T,0>,因此无需实例化此模板...

编辑:接受的标准锵的解释,什么是执行模板参数编译时检查的规范呢?

Xaxxon

我相信clang是正确的,因为Assert<false>它不是依赖类型。

http://en.cppreference.com/w/cpp/language/dependent_name

在模板定义时查找并绑定非相关名称。这种结合保持即使在模板实例化的角度来看,有一个更好的匹配:

不要做不能有效的专业化。使它们通用,并使用static_assert(具有从属值)检查无效的模板参数类型/值。static_assert(std::is_same<T, int>::value)要么static_assert(N != 0)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用clang的显式C ++模板实例化

GCC中的模板实例化与Visual C ++不同

在C ++模板实例化中查找从属名称

C ++概念:检查模板实例化

相互引用的C ++模板实例化

努力理解C ++模板实例化

C ++解析器如何区分比较和模板实例化?

C ++ 17单独的显式方法模板实例化声明和定义

在可以区分比较和模板实例化之前,C ++解析器会做什么?

在C ++中的模板实例化中将带有构造函数的类用作类型参数

如何在C ++中编写代码以执行条件模板实例化

C ++中重载乘法运算符的递归类模板实例化期间的错误

为什么C ++模板实例化失败?

跨DLL的C ++成员函数显式模板实例化

具有if语句的C ++模板实例化

具有复杂类型的C ++模板实例化

为什么C ++函数模板实例化的返回类型包含在错误的函数名称中?

从模板实例化后声明的模板函数选择候选中调用的C ++模板过载解析

C ++模板类型的圆度和指向模板实例的非模板指针

在C中调用GNU Octave函数吗?

GNU C中的__attribute __((const))与__attribute __((pure))

在GNU屏幕中禁用Ctrl + C?

可以实例化c ++类模板,但是具有相同模板参数的功能模板实例化失败

C ++,使用模板实例化存储对象实例的通用节点

模板实例变量的C ++检查类型

C ++模板实例化:避免长时间切换

在C ++模板实例化期间获取原始结构/类名称

C ++ VS2008-类模板实例化上的奇怪错误

在这种情况下,c ++标准是否保证模板实例化?