【发布时间】:2014-09-08 02:56:19
【问题描述】:
using intArray = int[];
int (&a) [4] = intArray{1, 2, 3, 4};
这是不允许的,因为将非常量左值引用绑定到临时(右值)是非法的。 g++ 4.9.1 和 clang 3.4.2 都返回错误;当a 是const 合格时,它编译得很好
int const (&a) [4] = intArray{1, 2, 3, 4};
但是,当我这样做时
int &x = intArray{1, 2, 3, 4} [1];
两个编译器都能正常编译,没有错误。 §5.2.1 Subscripting 说,为此挖掘标准(草案 N3337)
1 后缀表达式后跟方括号中的表达式是后缀表达式。其中一个表达式应具有“指向 T 的指针”类型,而另一个应具有无作用域枚举或整数类型。 结果是“T”类型的左值。“T”类型应该是完全定义的对象类型。表达式 E1[E2] 与 *((E1)+(E2)) 相同(根据定义)
2 花括号初始化列表不能与内置下标运算符一起使用。
-
如果我选择 1 那么我不明白为什么标准允许构造临时数组,因为在其中下标一个元素会给出一个左值,即我可以从一个临时数组中获取一个左值这与临时对象的原始概念相矛盾,只能绑定到 const 左值引用或右值引用。
-
如果我使用 2 那么为什么编译器在我执行
{1, 2, 3, 4}[1]时不会抛出错误?
【问题讨论】:
标签: c++ arrays c++11 temporary rvalue