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

时间:2012-02-07 20:37:21

标签: c++ templates const

为什么这样做?

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

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

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

编译器错误:

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

错误:模板参数2无效

2 个答案:

答案 0 :(得分:6)

不同之处在于const会影响链接。如果您添加extern,它会起作用。那就是说,据我所知:

  

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

     

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

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

它也可以在没有extern的情况下工作。允许该对象具有内部链接,但您的编译器尚不支持该内容。这是C ++ 11中的一个变化,之前的C ++标准不允许它。

答案 1 :(得分:1)

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

以下是 工作的示例:

typedef const char *nontype_t;
template <nontype_t> struct Y {};

char hello[] = "hello";
constexpr char* world = hello;

int main()
{
    Y<hello> a;
}