const变量作为非类型模板参数(variable不能出现在常量表达式中)

const variable as non-type template parameter (VARIABLE cannot appear in a constant-expression)

本文关键字:不能 常量 表达式 variable 变量 类型 参数 const      更新时间:2023-10-16

为什么这样做?

char __nontype[] = "foo";
typedef TemplateClass<T, __nontype> MyClass;

但是这个(有一个常量变量)不是吗?

const char __nontype[] = "foo";
typedef TemplateClass<T, __nontype> MyClass;

编译器错误:

错误:'__nontype'不能出现在常量表达式中

错误:模板参数2无效

区别在于const会影响链接。如果添加extern,它会起作用。也就是说,据我所知:

14.3.2模板非类型参数[temp.arg.notype]

非类型、非模板模板参数的模板自变量应为以下之一:

  • 积分常数表达式(包括可以用作5.19中描述的积分常数表达式的文字类类型的常数表达式);或
  • 非类型模板参数的名称;或
  • 常数表达式(5.19),指定具有静态存储持续时间和外部或内部链接的对象的地址,或具有外部或内部连接的函数的地址,包括函数模板和函数模板id,但不包括非静态类成员,表示为(忽略圆括号)&id表达式,除了&如果名称引用函数或数组,则可以省略;如果相应的模板参数是引用,则应省略;或
  • 常数表达式,其评估为空指针值(4.10);或
  • 常数表达式,其评估为空成员指针值(4.11);或
  • 指向如5.3.1中所述的成员的指针

它也应该在没有CCD_ 3的情况下工作。允许对象具有内部链接,但编译器还不支持这种链接。这是C++11中的一个变化,以前的C++标准不允许这样做。

错误表明:结果不是一个常量表达式(在链接时已知,但在编译时未知)。

以下是工作的示例:

typedef const char *nontype_t;
template <nontype_t> struct Y {};
char hello[] = "hello";
constexpr char* world = hello;
int main()
{
    Y<hello> a;
}
相关文章: