在下面的代码中,我传递了类类型R
和该类型的常量表达式作为模板参数。但是clang并不接受这个:
#include <iostream>
template<class T, T t>
void foo(){ std::cout << "foo()" << std::endl; }
class R
{
public:
int f;
constexpr R(): f(15){ }
};
constexpr R r;
int main(){ foo<R, r>(); } //note: candidate template ignored:
//invalid explicitly-specified argument
//for template parameter 't'
在N4296::14.3.2 [temp.arg.nontype]
中我找不到除非类型模板参数之外的任何限制应该是常量表达式。
答案 0 :(得分:4)
§14.1[temp.param] / p4:
非类型模板参数应具有以下之一 (可选择cv-qualified)类型:
- 整数或枚举类型,
- 指向对象或指向函数的指针,
- 对对象的左值引用或对函数的左值引用,
- 指向成员的指针,
std::nullptr_t
。
类类型不是这些。