xvalue 上的下标表达式的值类别
Value category of the subscript-expression on xvalue
从 5.2.1.1 开始:
The expression E1[E2]
is identical (by definition) to *((E1)+(E2))
[...] except that in the case of an array operand, the result is an lvalue if that operand is an lvalue and an xvalue otherwise.
但是,使用以下代码:
struct S
{
int arr[5];
};
int main()
{
int &&r = S().arr[0];
}
GCC 和 Clang 都抱怨 "rvalue reference cannot bind to lvalue int"。
我误解了什么?据我了解 S()
是右值,S().arr
是 xvalue,所以 S().arr[0]
也应该是 xvalue 并且应该能够绑定到右值引用。
你是对的,因为你引用的原因。 S().arr[0]
自 DR 1213 起是一个 xvalue,因此您应该能够将右值引用绑定到它。
这是gcc bug 79832. Note that clang HEAD compiles this fine。
从 5.2.1.1 开始:
The expression
E1[E2]
is identical (by definition) to*((E1)+(E2))
[...] except that in the case of an array operand, the result is an lvalue if that operand is an lvalue and an xvalue otherwise.
但是,使用以下代码:
struct S
{
int arr[5];
};
int main()
{
int &&r = S().arr[0];
}
GCC 和 Clang 都抱怨 "rvalue reference cannot bind to lvalue int"。
我误解了什么?据我了解 S()
是右值,S().arr
是 xvalue,所以 S().arr[0]
也应该是 xvalue 并且应该能够绑定到右值引用。
你是对的,因为你引用的原因。 S().arr[0]
自 DR 1213 起是一个 xvalue,因此您应该能够将右值引用绑定到它。
这是gcc bug 79832. Note that clang HEAD compiles this fine。