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

ejo*_*rns 8 c++ templates const

为什么这样做?

char __nontype[] = "foo";
typedef TemplateClass<T, __nontype> MyClass;
Run Code Online (Sandbox Code Playgroud)

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

const char __nontype[] = "foo";
typedef TemplateClass<T, __nontype> MyClass;
Run Code Online (Sandbox Code Playgroud)

编译器错误:

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

错误:模板参数2无效

小智 6

不同之处在于const影响联系.它可以添加extern.那就是说,据我所知:

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

非类型非模板模板参数的模板参数应为以下之一:

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

它也应该没有extern.允许该对象具有内部链接,但您的编译器尚不支持该内容.这是C++ 11中的一个变化,以前的C++标准不允许它.