【问题标题】:Why is one expression constant, but not the other?为什么一个表达式是常量,而另一个不是?
【发布时间】:2026-01-05 19:25:01
【问题描述】:

为什么 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

【问题讨论】:

标签: c++ c++11 visual-studio-2013 static-assert


【解决方案1】:

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

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

【讨论】:

  • 这似乎是正确的 - 如果顺序被切换(在第二个断言中)它无法像第一个那样编译。
  • 这只是 MSVC 的事情还是这种初始化的常见问题?
  • @WillBickford:缺少constexpr 是MSVC 的问题——它应该是任何符合C++11(或更高版本)实现的常量表达式。 static_assert 中的常量表达式要求和 || 的短路评估是标准的。
  • 我的意思是用非 constexpr 初始化 const 变量的效果。那不应该产生编译器警告或错误吗?
  • @WillBickford:不,它只是意味着变量,虽然仍然是常量(即无法更改),但必须在运行时初始化并且不能用作常量表达式。
最近更新 更多