模板参数中的const

时间:2012-11-17 22:05:49

标签: c++ templates const

此模板中const关键字的效果是什么?

template <class T, int const ROWNUM, int const COLNUM> 
class Matrix

这是否意味着此模板仅接受const作为参数?如果是,有没有办法将变量作为COLNUMROWNUM

传递

(当我尝试将变量作为模板的COLNUM传递时,它会出错:“IntelliSense:expression必须具有常量值”)

2 个答案:

答案 0 :(得分:19)

它被忽略了:

  

[C++11: 14.1/4]:非类型模板参数应具有以下之一(可选 cv-qualified )类型:

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

[C++11: 14.1/5]: [注意:其他类型在管理 template-arguments (14.3)的形式的规则下明确禁止或隐式禁止。 -end note ] 模板参数上的顶级 cv-qualifiers 在确定其类型时会被忽略

在C ++ 03中的相同位置存在相同的措辞。

这部分是因为无论如何必须在编译时知道模板参数。因此,无论您是否constyou may not pass some variable value

template <int N>
void f()
{
    N = 42;
}

template <int const N>
void g()
{
    N = 42;
}

int main()
{
    f<0>();
    g<0>();

    static const int h = 1;
    f<h>();
    g<h>();
}
  

prog.cpp:在函数' void f()[with int N = 0] '中:   prog.cpp:15:从这里实例化   prog.cpp:4:错误:作为左操作数分配所需的左值
  prog.cpp:在函数' void g()[with int N = 0] ':
  prog.cpp:16:从这里实例化   prog.cpp:10:错误:左值作为赋值的左操作数
  prog.cpp:在函数' void f()[with int N = 1] ':
  prog.cpp:19:从这里实例化   prog.cpp:4:错误:作为左操作数分配所需的左值
  prog.cpp:在函数' void g()[with int N = 1] ':
  prog.cpp:20:从这里实例化   prog.cpp:10:错误:左值作为赋值的左操作数

答案 1 :(得分:2)

您的案例中不需要

const

例如,下面的类Matrix_AMatrix_B对于编译器的观点来说都是相同的const这里只是为了强制ROWNUMCOLNUM对于人类观点是不变的,但不是必需的。

template <class T, int const ROWNUM, int const COLNUM> 
class Matrix_A 
{
};

template <class T, int       ROWNUM, int       COLNUM> 
class Matrix_B
{
};

此外,课程Matrix_C还以另一种方式指定了类似的常量变量ROWNUMCOLNUM

template <class T> 
class Matrix_C
{
   static int const ROWNUM = 5;
   static int const COLNUM = 20;
};

// the following three objects use constant variables ROWNUM and COLNUM
Matrix_A<bool,5,20> a;
Matrix_B<bool,5,20> b;
Matrix_C<bool>      c;