我对此代码有点困惑:
struct A
{
A& bar()&&;
};
A& A::bar()&&
{
std::cout << "A::bar()&&\n";
return *this;
}
int main()
{
A{}.bar();// called by an rvalue
}
所以,我的理解是bar
只能由可修改的右值调用。直到这是可以的。但是bar
如何返回对该右值的非恒定左值引用?
bar()
如何绑定并返回对该右值对象的可修改左值引用?要轻浮一些:原因是类this
的C
指针可以是C*
或const C*
-不能是C& *
或C&& *
(这些不是实际类型) ;您不能声明C& * ptr
)。因此,即使您的方法针对类A
的右值实例运行,您还是get one of those two(GodBolt)。当您应用*
运算符时,您将get an lvalue,而不是右值。
一元
*
运算符执行间接操作:对其应用的表达式应为指向对象类型的指针,或者为指向函数类型的指针,并且结果为左值引用对象或函数表达式所指向的位置。如果表达式的类型为“指向T
的指针”,则结果的类型为“T
”。 [注意:通过指针指向不完整类型(cv void除外)的间接有效。这样获得的左值可以有限的方式使用(例如,初始化引用);该左值不能转换为pr值,请参见[conv.lval]。 —尾注]
重点矿
所以当您取消引用this
时,您将获得一个左值。这是否指向临时对象都无关紧要,您将始终获得一个左值。由于*this
是左值,因此法律上允许您返回左值引用,因此语法上中的程序正确。 Semantically并非如此,但是这很难测试,并且通常由于无法进行静态分析而无法诊断出来。
如果可以将语言更新到*
仅在将非右值限定的函数应用于this
时才产生左值的语言,那将很酷。