rvalue结构的成员是右值还是左值?

hps*_*use 26 c++ structure rvalue lvalue

返回结构的函数调用是一个rvalue表达式,但它的成员呢?
这段代码适用于我的g ++编译器,但是gcc给出了一个错误,说"左值作为赋值的左操作数":

struct A
{
    int v;
};

struct A fun()
{
    struct A tmp;
    return tmp;
}

int main()
{
    fun().v = 1;
}
Run Code Online (Sandbox Code Playgroud)

gcc视为fun().v右值,我能理解.
但是g ++并不认为赋值表达式是错误的.这是否意味着fun1().v是C++中的左值?
现在的问题是,我搜索了C++ 98/03标准,没有找到关于fun().v是左值还是左值的说法.
那么,它是什么?

Dav*_*eas 13

右值表达式的成员是右值.

5.3.5 [expr.ref]中的标准状态:

如果声明E2具有类型"引用T",那么E1.E2是左值[...] - 如果E2是非静态数据成员,并且E1的类型是"cq1 vq1 X",并且E2的类型是"cq2 vq2 T",表达式指定由第一个表达式指定的对象的命名成员.如果E1是左值,则E1.E2是左值.

  • 该部分是5.2.5.要成为肛门,如果E1不是左值,则该段落不指定任何内容.但是,C++ 0x附加"否则,它是一个右值". (4认同)
  • 它已经在即将推出的DR421标准中进行了修改,因此Potatoswatter指出,还有额外的'否则,它是一个rvalue'.根据标准委员会的说法,虽然措辞很不幸,但意图存在:http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/cwg_defects.html#421 (2认同)