字符串文字在C ++中是不可接受的模板参数吗?

时间:2013-11-19 07:57:52

标签: c++ templates

第724页,第25章,C ++编程语言

用作模板参数的指针必须是&of形式,其中是对象或函数的名称,或f形式的名称,其中f是函数的名称。指向成员的指针必须是&X::of形式,其中是成员的名称。特别是,字符串文字不能作为模板参数:

template<typename T, char∗ label>
class X {
    // ...
};
X<int,"BMW323Ci"> x1; // **error : string literal as template argument**
char lx2[] = "BMW323Ci";
X<int,lx2> x2; // OK: lx2 has exter nal linkage

第725页,第25章,C ++编程语言

当与默认模板参数(第25.2.5节)结合使用时,这变得特别有用;对于 例如:

template<typename T, T default_value = T{}>
class Vec {
    // ...
};
Vec<int,42> c1;
Vec<int> c11; // default_value is int{}, that is, 0
Vec<string,"fortytwo"> c2;  // **I'm confused!**
Vec<string> c22; // default_value is string{}; that is, ""

2 个答案:

答案 0 :(得分:1)

template<typename T, T default_value = T{}>
class Vec {
    // ...
};
Vec<string,"fortytwo"> c2;
Vec<string> c22;

涉及string的声明都不合法。

14.1 / 4:

  

非类型模板参数应具有以下之一(可选 cv-qualified )类型:

     
      
  • 整数或枚举类型,

  •   
  • 指向对象或指向函数的指针,

  •   
  • 对对象的左值引用或对函数的左值引用,

  •   
  • 指向成员的指针,

  •   
  • std::nullptr_t

  •   

14.1 / 7:

  

非类型模板参数不得声明为具有浮点,或void类型。

答案 1 :(得分:0)

字符串文字不能作为模板参数。使用第一个模板,您必须声明一个char数组以用作模板参数。

使用第二个模板,“fortytwo”不是字符串文字。相反,它是一个std :: string。