有没有办法让成员函数知道对象是右值还是左值?
Is there a way for a member function to know if the object is an rvalue or lvalue?
我的用例是我有一个 class X,它有一个 returns X 的修改副本的成员函数。其中一些成员函数可能像这样堆叠
X X_before{init};
X X_after = X_before.op_1().op_2().op_3();
在上面的代码中 op_1 将创建一个副本。现在我在想的是 op_2 和 op_3 真的没有理由还需要创建一个新副本,因为 X_before.op_1()
现在是一个右值。有没有办法在当前的 C++ 中实现这一点?我正在使用 C++14,但也想知道这在以后的版本中是否可行。
自 C++11 以来,我们有 ref-qualified member functions,通过重载决议,可以 select 根据要调用的对象是左值还是右值,适当的重载。
#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"
}
我的用例是我有一个 class X,它有一个 returns X 的修改副本的成员函数。其中一些成员函数可能像这样堆叠
X X_before{init};
X X_after = X_before.op_1().op_2().op_3();
在上面的代码中 op_1 将创建一个副本。现在我在想的是 op_2 和 op_3 真的没有理由还需要创建一个新副本,因为 X_before.op_1()
现在是一个右值。有没有办法在当前的 C++ 中实现这一点?我正在使用 C++14,但也想知道这在以后的版本中是否可行。
自 C++11 以来,我们有 ref-qualified member functions,通过重载决议,可以 select 根据要调用的对象是左值还是右值,适当的重载。
#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" }