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



我目前正在玩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 );
}

最新更新