【问题标题】:Is there a way for a member function to know if the object is an rvalue or lvalue?成员函数有没有办法知道对象是右值还是左值?
【发布时间】:2021-07-15 10:35:05
【问题描述】:

我的用例是我有一个类 X,它有一个返回 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++ c++14


    【解决方案1】:

    从 C++11 开始,我们有了 ref-qualified member functions,通过该重载解析可以根据要调用的对象是左值还是右值来选择适当的重载。

    #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"
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-08
      • 1970-01-01
      • 1970-01-01
      • 2021-04-17
      • 2011-01-03
      • 2019-11-17
      • 1970-01-01
      相关资源
      最近更新 更多