【发布时间】:2013-08-11 07:40:00
【问题描述】:
为什么const 和constexpr 与数组一起使用时会有区别?
int const xs[]{1, 2, 3};
constexpr int ys[]{1, 2, 3};
int as[xs[0]]; // error.
int bs[ys[0]]; // fine.
我希望xs[0] 和ys[0] 都是常量表达式,但只有后者被这样处理。
【问题讨论】:
-
constexpr值可以在编译时计算,const不能。 -
const数组不需要有可见的定义(它可以是extern或者可以在文件的后面定义),这就是存在差异的原因。至于为什么存在 this 差异,我怀疑标准 could 已经说过,当定义存在并且对constexpr有效时(如您的代码中所示),然后@ 987654331@ 与constexpr一样好,因为在这种情况下,信息可用于评估它。我不知道为什么它不这么说,但有一个很好的理由,“如果你希望你的数组是constexpr,那么就这么说吧”。 -
我认为,可能会增加您的问题的后续行动是为什么
int const x = 5;和constexpr int y = 5可以 both 用作数组 decls 的固定大小大小(int a[x], b[y]),但在不同处理的数组内部(参见上面史蒂夫的评论)。 -
@SteveJessop:还是会稍微复杂一些。
constexpr需要用其他constexpr初始化,const数组可以用非constexpr初始化,比如说函数f()和const T array[] = { f(1), f(2), f(3) };将是动态初始化,而不是静态(@ 987654343@) 初始化。 -
@DavidRodríguez-dribeas:这就是“定义存在并且对
constexpr有效”的意思。就像你说的那样,定义需要能够评估为constexpr,以便进行特殊处理。
标签: c++ arrays c++11 constants constexpr