struct S{
int a[3] = {1,2,3};
};
S&& f(){return S();}
&f().a; //[Error] taking address of xvalue (rvalue reference)
&f().a[0]; //ok in GCC 5.1.0 and Clang 3.6.0
S s;
&static_cast<S&&>(s).a; //[Error] taking address of xvalue (rvalue reference)
&static_cast<S&&>(s).a[0]; //ok in GCC 5.1.0 and Clang 3.6.0
5.7. Выражение представляет собой значение x, если оно:
(7.1) - результат вызова функции, неявно или явно, тип возвращаемого значения которой является ссылкой rvalue на тип объекта,
(7.2) - приведение к ссылке rvalue на тип объекта,
(7.3) - выражение доступа к члену класса, обозначающее нестатический элемент данных не ссылочного типа, в котором выражение объекта является значением x, или
(7.4) - выражение a. * pointer-to-member, в котором первый операнд является значением x, а второй операнд является указателем на элемент данных.
5.2.1 Подписчики Постфиксное выражение, за которым следует выражение в квадратных скобках, является постфиксным выражением. Одно из выражений должен иметь тип "массив
T
" или "указатель наT
", а другой должен иметь незапечатанное перечисление или интегрального типа. Результат имеет тип "T
". Тип "T
" должен быть полностью определенным типом объекта. ВыражениеE1[E2]
идентично (по определению) на*((E1)+(E2))<<*t
[Примечание: см. 5.3 и 5.7 для деталей*
и+
и 8.3.4 для деталей массивов. -end note], , за исключением того, что в случае операнда массива результат равен lvalue, если этот операнд является lvalue и xvalue в противном случае.
Итак, f().a[0]
значение x?
Я думаю, f().a[0]
должен быть значением x.
[Edit1]
Игнорирование &f().a;
и &f().a[0];
, поскольку 12.2 [class.temporary] p5.2
Время жизни временной привязки к возвращаемому значению в операторе return функции (6.6.3) не является продлен; временное уничтожается в конце полного выражения в заявлении return
static_cast<S&&>(s).a
- значение x (7.2 и 7.3).
", за исключением того, что в случае операнда массива результат равен lvalue, если этот операнд является lvalue и xvalue в противном случае."
Итак, я думаю, что static_cast<S&&>(s).a[0]
должен быть xvalue, но
&static_cast<S&&>(s).a[0]; //ok in GCC 5.1.0 and Clang 3.6.0
Questing:
Неужели я ошибаюсь? Если я ошибаюсь, покажите мне пример, в котором подписи массива будут получены значения xvalue.