如何解决此错误“ x1的值在常量表达式中不可用”? static_assert

时间:2018-06-29 11:45:33

标签: c++ c++11

给出以下代码(仅用于示例):

    int x1 = 4;
    int x2 = 5;
    static_assert(x1 != x2 ,"Error");

我收到以下错误:

  

'x1'的值不能在常量表达式中使用

我该如何解决?


注意:我正在寻找一种解决方法,而无需以这种方式更改变量的定义:

const int x1 = 4;
const int x2 = 5;

但是,我只想通过更改static_assert(..)

的行来修复它

2 个答案:

答案 0 :(得分:7)

好吧,正确的解决方法是

constexpr int x1 = 4;
constexpr int x2 = 5;

否则,编译器如何(完全通用和一致)知道x1x2是编译时可评估的常量表达式?

如果x1x2必须为int类型,则需要使用运行时断言,例如assert

assert(x1 != x2)

但是请注意,如果定义了assert,则不会评估传递给NDEBUG的表达式。如果该表达式有副作用,则可能导致不同的构建配置出现问题。

参考:https://en.cppreference.com/w/cpp/error/assert

答案 1 :(得分:2)

您必须使用 runtime 断言,例如:

#include <cassert>

// ...

int x1 = 4;
int x2 = 5;

assert(x1 != x2);

注意:使用assert的运行时断言仅在以调试模式编译时适用,在以 release 模式编译时会被删除。因此,它们不会降低应用程序的速度。它们是零成本,因此您可以(并且可以说应该)自由使用它们来检查边界条件和总体正确性。

一个重要的考虑因素(道具@Bathsheba)是这些断言不应该调用 副作用 ,因为调试版本发行版本之间的行为会有所不同。

例如

// in the release version x2 will NOT be incremented!!!
assert(x1 != x2++); // BAD!!