C++ 为什么一个表达式是常量,而另一个表达式不是常量?

C++ 为什么一个表达式是常量,而另一个表达式不是常量?,c++,c++11,visual-studio-2013,static-assert,C++,C++11,Visual Studio 2013,Static Assert,为什么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

为什么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
#包括
输入频率;
常数频率minHz{0};
常量频率maxHz{std::numeric_limits::max()};
恒定频率无效赫兹{-1};
静态断言(minHzmaxHz,“invalidHz有效”);//好啊

我猜,在该实现中,
max()
不是
constepr
(正如C++11所说的那样),因此
maxHz
不是一个常量表达式,而
minHz
invalidHz


因此,第一个断言失败,因为它在编译时无法评估;第二次成功,因为
|
之前的比较为真,所以第二次比较不会被计算。

可能是因为
constexpr
还没有被计算。@DarkFalcon:VS 2013编译器永远不会在VS2015 RC上编译得很好。这似乎是正确的-如果顺序被切换(在第二个断言中),它将无法像第一个一样编译。这只是MSVC的问题还是这种初始化类型的常见问题?@WillBickford:constexpr的缺乏是MSVC的问题-在任何符合C++11的情况下,它都应该是一个常量表达式(或更高版本)实现。
static_assert
中对常量表达式的要求以及
|
的短路求值都是标准的。我的意思是用非constexpr初始化常量变量的效果。这不应该生成编译器警告或错误吗?@WillBickford:不,它只是意味着该变量仍然是constant(即无法更改)必须在运行时初始化,不能用作常量表达式。