我目前正在玩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 );
这是为什么呢?我的 a 是常量。我可以想象该值将被转换为 const 并且以前是非常量,那么是的,应该出现错误。但仅在成员函数内部,我不希望出现任何错误。
我该如何解决这个问题?如果无法解决,我也很高兴得到答案,这里有点好奇。
static_assert
中的表达式必须是编译时常量。const
函数参数只是不可变的,但在编译时是未知的。
为什么?我
a
是常量。
因为你的a
不是编译时常量。在这方面,错误消息不是很精确。static_assert
表达式必须是编译时常量。
const
通常声明运行时恒常性。它确保对象在其整个生存期内不会被修改。但是编译器无法知道在运行时将使用什么值来初始化参数(即传递给函数(。
我该如何解决这个问题?
要么不使用static_assert
,要么使用模板参数而不是运行时参数(在这种情况下,您首先需要有一个函数模板(。例:
template<int a>
void func(){
static_assert(a == 3);
}
有趣的是,函数参数上的顶级常量(和易失性(限定符被忽略。试试吧 - 你不能像
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 );
}