为什么一个表达式不变,而另一个表达式不变?

jto*_*ker 8 c++ static-assert c++11 visual-studio-2013

为什么Visual Studio 2013编译器拒绝第一个静态断言(错误C2057),而不是第二个?

#include <limits>

typedef int Frequency;

const Frequency minHz{ 0 };
const Frequency maxHz{ std::numeric_limits<Frequency>::max() };
const Frequency invalidHz{ -1 };
static_assert(minHz < maxHz, "minHz must be less than maxHz");                // C2057
static_assert(invalidHz < minHz || invalidHz > maxHz, "invalidHz is valid");  // OK
Run Code Online (Sandbox Code Playgroud)

Mik*_*our 8

我猜想,在那个实现中,max()不是constexpr(正如C++ 11所说的那样),所以这maxHz不是一个常量表达式,minHz而且invalidHz是.

因此第一个断言失败,因为它无法在编译时进行评估; 第二个成功,因为之前的比较||是真的,所以不评估第二个比较.

  • @WillBickford:不,它只是意味着变量虽然仍然是常量(即无法更改),但必须在运行时初始化,不能用作常量表达式. (2认同)