C++ 成员函数能否返回对右值对象的可修改左值引用?

C++ 成员函数能否返回对右值对象的可修改左值引用?,c++,c++11,rvalue-reference,lvalue,C++,C++11,Rvalue Reference,Lvalue,我对这段代码有点困惑: struct A { A& bar()&&; }; A& A::bar()&& { std::cout << "A::bar()&&\n"; return *this; } int main() { A{}.bar();// called by an rvalue } 结构A { A&bar(); }; A&A::bar()&& { std::cout原因是类

我对这段代码有点困惑:

struct A
{
    A& bar()&&;
};

A& A::bar()&&
{
    std::cout << "A::bar()&&\n";
    return *this;
}

int main()
{
    A{}.bar();// called by an rvalue
}
结构A { A&bar(); }; A&A::bar()&& {
std::cout原因是类
C
指针可以是
C*
const C*
-而不是
C&*
C&&*
(这些不是实际类型;不能声明
C&*ptr
)。因此,即使您的方法为类
a
的右值实例运行,您也可以(GodBolt)。当您应用
*
操作符时,您,而不是右值。

这与

一元
*
运算符执行间接寻址:应用该运算符的表达式应为指向对象类型的指针,或指向函数类型的指针,结果为一个左值,该左值引用表达式指向的对象或函数。如果表达式的类型为“指向
T
”,结果的类型为“
T
”[注:通过指向不完整类型(cv void除外)的指针进行间接寻址是有效的。由此获得的左值可以以有限的方式使用(例如初始化引用);此左值不得转换为PR值,请参见[conv.lval]。-结束说明]

重点矿山

因此,当你取消引用
这个
时,你会得到一个左值。不管它是否指向一个临时对象,你总是会得到一个左值。因为
*这个
是一个左值,你在法律上被允许返回一个左值引用,程序在语法上是正确的。在语义上不是,但这很难理解测试和通常不是诊断的东西,因为它需要相当多的静态分析



<> P> >如果代码“> > */C++”在“非代码”限定的函数中应用到<代码> < <代码>时,它将是一个很酷的语言。

它可以。C++允许你在你的脚上开枪,如果你想的话,你也可以重新解释它(0x1234)。+ +如果你坚持的话,嗯,我想我们是否可以认为这是语言的一个缺陷。如果我们可以让<代码> *这个< /代码>解析为<代码> t&&<代码>,那将是很酷的,如果函数是<代码> &和/代码>合格的。真的很神奇!所以这是因为“引用引用操作符”。产生一个左值,因此它可以绑定到一个非常量左值引用?另一件事是,右值引用本身就是一个左值,尽管它引用到右值。这是真的吗?谢谢!Maestro Yep对问题1。是的,这是真的,对于问题2。所有引用都是左值。还有,任何有名称的东西都是左值,除了
这个
>啊,好吧!我错过了最后一个“关于这件事”。谢谢。非常感谢!@Maestro:我们都应该感谢。它真的应该得到更多的关注。