【发布时间】:2013-09-25 00:51:24
【问题描述】:
以下 C++11 程序是否格式错误?
const int x[] = {1,2,3};
static_assert(x[0] == 1, "yay");
int main() {}
gcc 和 clang 似乎是这么认为的,但是为什么x[0] == 1 不是一个常量表达式呢?
x[0] == 1
subscript operator
*(x+0) == 1
array-to-pointer conversion (int* p = x)
*(p+0) == 1
pointer addition
*p == 1
indirection (lvalue y = x[0])
y == 1
lvalue-to-rvalue conversion:
整数(是的,它具有 const int 类型)或引用非易失性 const 对象的枚举类型(是的,它具有类型const int) 带有前面的初始化(是初始化为 1),初始化为常量表达式(是的 1 是常量表达式)
看起来不错,x 数组的第一个元素满足这些条件。
1 == 1
?
这是编译器错误、标准缺陷还是我遗漏了什么?
5.19 [expr.const] 的哪一部分说这不是一个常量表达式?
【问题讨论】:
-
昨天的问题好像是这样的:stackoverflow.com/questions/18878427
-
它是部分相关的,但不是骗子。事实上,我是在研究完那个问题后才问这个问题的。我认为答案可能是错误的 - 但这里的区别在于
x[0]具有整数类型,因此应该允许左值到右值的转换,但它仍然不是。 -
伙计们,这不是骗子!答案不适用于这里!这看起来像是编译器错误或标准缺陷。
-
撤回了欺骗投票。 (好在你现在可以做到!)
-
我不知道标准的哪一部分支持它,但总的来说,
constexpr一直被要求使用常量数组元素作为编译时常量。您不能将常量数组元素用作case或模板参数,除非您使用constexpr,我相信这被认为是正常的。也许您找到了规范错误指定此行为的地方?
标签: c++ c++11 constants constexpr