成员函数 returns 可以修改右值对象的左值引用吗?

Can a member function returns a modifiable lvalue reference to an rvalue object?

我对这段代码有点困惑:

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

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

int main()
{
    A{}.bar();// called by an rvalue
}

所以我的理解是 bar 只能由可修改的右值调用。到此为止就OK了。但是如何 bar return 一个非常量左值引用到那个右值呢?

原因是 class Cthis 指针可以是 C*const C* - 而不是 C& *C&& *(这些不是实际类型;您不能声明 C& * ptr)。因此,即使您的方法针对 class A 的右值实例运行,您 get one of those two (GodBolt). And when you apply the * operator, you get an lvalue 也不是右值。

这与[expr.unary.op]/1

有关

The unary * operator performs indirection: the expression to which it is applied shall be a pointer to an object type, or a pointer to a function type and the result is an lvalue referring to the object or function to which the expression points. If the type of the expression is “pointer to T”, the type of the result is “T”. [ Note: Indirection through a pointer to an incomplete type (other than cv void) is valid. The lvalue thus obtained can be used in limited ways (to initialize a reference, for example); this lvalue must not be converted to a prvalue, see [conv.lval]. — end note ]

强调我的

所以当你取消引用时 this 你会得到一个左值。 this 是否指向一个临时对象并不重要,你总是会得到一个左值。由于 *this 是一个左值,因此在法律上允许您 return 一个左值引用, 中的程序在语法上 是正确的。 从语义上讲 不是,但是要测试它要困难得多,而且通常不会被诊断出来,因为它需要相当多的静态分析。


如果可以更新语言,其中 * 仅在非右值限定函数中应用于 this 时产生左值,那就太好了。