我们如何使用模板参数类型的变量?

时间:2015-02-07 07:29:50

标签: c++ templates

在下面的代码中,我传递了类类型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'

DEMO

N4296::14.3.2 [temp.arg.nontype]中我找不到除非类型模板参数之外的任何限制应该是常量表达式。

1 个答案:

答案 0 :(得分:4)

§14.1[temp.param] / p4:

  

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

     
      
  • 整数或枚举类型,
  •   
  • 指向对象或指向函数的指针,
  •   
  • 对对象的左值引用或对函数的左值引用,
  •   
  • 指向成员的指针,
  •   
  • std::nullptr_t
  •   

类类型不是这些。