为什么一个表达式是常量,而另一个不是?
Why is one expression constant, but not the other?
为什么 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
我猜想,在那个实现中,max()
不是 constexpr
(正如 C++11 所说的那样),因此 maxHz
不是常量表达式,而 minHz
和 invalidHz
是。
因此第一个断言失败,因为它无法在编译时求值;第二次成功,因为 ||
之前的比较为真,所以第二次比较没有被评估。
为什么 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
我猜想,在那个实现中,max()
不是 constexpr
(正如 C++11 所说的那样),因此 maxHz
不是常量表达式,而 minHz
和 invalidHz
是。
因此第一个断言失败,因为它无法在编译时求值;第二次成功,因为 ||
之前的比较为真,所以第二次比较没有被评估。