我目前正在玩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,那么应该出现一个错误。但是仅在成员函数内部,我不会期望任何错误。
我该如何解决?如果无法解决,我也很高兴得到一个答案,在这里有点好奇。
答案 0 :(得分:7)
static_assert
中的表达式必须为compile-time constant。 const
函数参数只是不可变的,但在编译时未知。
答案 1 :(得分:4)
这是为什么?我的
a
是常量。
因为您的a
不是编译时间常量。该错误消息在这方面不是很精确。 static_assert
的表达式必须是编译时间常数。
const
通常声明运行时常量。它确保对象在整个生命周期中都不会被修改。但是编译器无法在运行时知道将使用什么值来初始化参数(即传递给函数的参数)。
我该如何解决?
要么不使用static_assert
,要么使用模板参数而不是运行时参数(在这种情况下,您首先需要具有函数模板)。示例:
template<int a>
void func(){
static_assert(a == 3);
}
答案 2 :(得分:1)
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 );
}