using intArray = int[];
int (&a) [4] = intArray{1, 2, 3, 4};
Это не допускается, так как нелегально связывать ссылку non-const lvalue с временным (rvalue). Оба 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];
оба компилятора скомпилируют его без ошибок. Копая стандарт (черновик N3337) для этого, §5.2.1 Subscripting
говорит
1 Постфиксное выражение, за которым следует выражение в квадратных скобках, является постфиксным выражением. Одно из выражений должно иметь тип "указатель на Т", а другой должен иметь неперечисленное перечисление или интегральный тип. Результатом является lvalue типа "T." Тип "T" должен быть полностью определенным типом объекта. Выражение E1 [E2] идентично (по определению) к * ((E1) + (E2))
2 Список заблокированных-init не должен использоваться со встроенным оператором индексирования.
-
Если я иду с 1, то я не понимаю, почему стандарт позволяет создавать временные массивы, так как подписи в элементе в нем выдают lvalue, т.е. я могу получить lvalue из временного, что противоречит оригиналу понятие временных рядов может быть связано только с константными ссылками или ссылками rvalue.
-
Если я иду с 2, то почему компиляторы не выдают ошибку, когда я делаю
{1, 2, 3, 4}[1]
?