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

问题描述 投票:2回答:2

我对此代码有点困惑:

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()如何绑定并返回对该右值对象的可修改左值引用?
c++ c++11 rvalue-reference lvalue
2个回答
1
投票

要轻浮一些:原因是类thisC指针可以是C*const C*-不能是C& *C&& *(这些不是实际类型) ;您不能声明C& * ptr)。因此,即使您的方法针对类A的右值实例运行,您还是get one of those two(GodBolt)。当您应用*运算符时,您将get an lvalue,而不是右值。


1
投票

[expr.unary.op]/1有关

一元*运算符执行间接操作:对其应用的表达式应为指向对象类型的指针,或者为指向函数类型的指针,并且结果为左值引用对象或函数表达式所指向的位置。如果表达式的类型为“指向T的指针”,则结果的类型为“ T”。 [注意:通过指针指向不完整类型(cv void除外)的间接有效。这样获得的左值可以有限的方式使用(例如,初始化引用);该左值不能转换为pr值,请参见[conv.lval]。 —尾注]

重点矿

所以当您取消引用this时,您将获得一个左值。这是否指向临时对象都无关紧要,您将始终获得一个左值。由于*this是左值,因此法律上允许您返回左值引用,因此语法上中的程序正确。 Semantically并非如此,但是这很难测试,并且通常由于无法进行静态分析而无法诊断出来。


如果可以将语言更新到*仅在将非右值限定的函数应用于this时才产生左值的语言,那将很酷。

© www.soinside.com 2019 - 2024. All rights reserved.