有没有办法让成员函数知道对象是右值还是左值?

SMe*_*ric 1 c++ c++14

我的用例是我有一个类 X,它有一个成员函数返回 X 的修改副本。其中一些成员函数可能像这样堆叠

X X_before{init};
X X_after = X_before.op_1().op_2().op_3();
Run Code Online (Sandbox Code Playgroud)

在上面的代码中 op_1 将创建一个副本。现在我在想的是,真的没有理由 op_2 和 op_3 还需要创建一个新副本,因为X_before.op_1()现在是右值。有没有办法在当前的 C++ 中实现这一点?我正在使用 C++14,但也有兴趣知道这在以后的版本中是否可行。

son*_*yao 6

从 C++11 开始,我们有ref 限定成员函数,重载决议可以根据要调用的对象是左值还是右值来选择适当的重载。

#include <iostream>
struct S {
    void f() & { std::cout << "lvalue\n"; }
    void f() &&{ std::cout << "rvalue\n"; }
};
 
int main(){
    S s;
    s.f();            // prints "lvalue"
    std::move(s).f(); // prints "rvalue"
    S().f();          // prints "rvalue"
}
Run Code Online (Sandbox Code Playgroud)