为什么第一个声明没问题,但第二声明没有?为什么std::string
不合适?
template <typename T, T x> struct foo { };
using namespace std;
int main()
{
foo<int, 0> f_int; // ok
foo<string, ""> f_string; // not ok
}
我明白了:
error: a non-type template parameter cannot have type 'std::basic_string<char>'
使用clang ++。
答案 0 :(得分:8)
您根本无法拥有std::string
类型的模板参数。非类型模板参数的规则由标准定义如下(§14.1/ 4):
非类型模板参数应具有以下之一(可选 cv-qualified )类型:
- 整数或枚举类型,
- 指向对象或指向函数的指针,
- 对对象的左值引用或对函数的左值引用,
- 指向成员的指针,
std::nullptr_t
。
此外(§14.1/ 7):
非类型模板参数不得声明为具有浮点,类或void类型。
由于std::string
是类类型,因此不允许实例化foo
。
答案 1 :(得分:5)
因为非类型模板参数(“值”的丑陋名称)应该在编译时可计算而std::string
不可计算(它可能需要动态内存分配,因此其构造函数不是constexpr
)