Из 5.2.1.1:
Выражение
E1[E2]
идентичен (по определению)*((E1)+(E2))
[…] за исключением того, что в случае операнда массива, результатом является lvalue, если этот операнд является lvalue и xvalue в противном случае.
Тем не менее, с кодом ниже:
struct S
{
int arr[5];
};
int main()
{
int &&r = S().arr[0];
}
и GCC, и Clang жалуются на то, что «ссылка на rvalue не может связываться с lvalue int».
Что я неправильно понял? Насколько я понимаю S()
это значение, S().arr
это xvalue, так S().arr[0]
также должен быть xvalue и иметь возможность связываться с rvalue refs.
Вы правы по той причине, которую цитируете. S().arr[0]
это xvalue с DR 1213, так что вы должны иметь возможность связать ссылку на него.
Это gcc bug 79832. Обратите внимание, что clang HEAD компилирует это отлично.
Других решений пока нет …