为什么static_assert在带有const参数的成员函数中不起作用?

时间:2019-09-03 13:57:43

标签: c++

我目前正在玩static_assert,遇到了这个问题:

class A
{
public:
   void func( const int a ){
      static_assert( a == 3 );
   }
};

给我:

error: non-constant condition for static assertion static_assert( a == 3 );

这是为什么?我的是const。我可以想象该值将被强制转换为const,而以前是非const,那么应该出现一个错误。但是仅在成员函数内部,我不会期望任何错误。

我该如何解决?如果无法解决,我也很高兴得到一个答案,在这里有点好奇。

3 个答案:

答案 0 :(得分:7)

static_assert中的表达式必须为compile-time constantconst函数参数只是不可变的,但在编译时未知。

答案 1 :(得分:4)

  

这是为什么?我的a是常量。

因为您的a不是编译时间常量。该错误消息在这方面不是很精确。 static_assert的表达式必须是编译时间常数。

const通常声明运行时常量。它确保对象在整个生命周期中都不会被修改。但是编译器无法在运行时知道将使用什么值来初始化参数(即传递给函数的参数)。

  

我该如何解决?

要么不使用static_assert,要么使用模板参数而不是运行时参数(在这种情况下,您首先需要具有函数模板)。示例:

template<int a>
void func(){
   static_assert(a == 3);
}

答案 2 :(得分:1)

有趣的是,将忽略函数参数上的顶级const(和易失性)限定符。尝试一下-您不能像这样设置重载

void func(int a);
void func(const int a);

在某种意义上,这大致是因为顶级类型(即,如果参数是指针,则不是指向类型)已通过值传递。 (这种直观的论点并不完全适用于引用,但是无论如何它们始终是不可变的。)

无论如何,即使它确实是 const(它绝对不是),这也只是保证不改变其他可以在运行时改变的值。它不会在编译时就知道它。

请考虑将其编译,即使参数为const int &,也仅是func不会突变i的保证。在程序运行并接收输入之前,没人知道它的值。

int i;
std::cin >> i;
a.func(i);

您可以改写

template <int a>
void func(){
  static_assert( a == 3 );
}