【问题标题】:Getting the address of an rvalue获取右值的地址
【发布时间】:2012-03-20 11:52:11
【问题描述】:
class MyClass {
    public: MyClass(int a) : a(a) { }
    int a;
};

#include <iostream>
void print(MyClass* a) { std::cout << a->a << std::endl; }

int main() {
    print(&static_cast<MyClass&&>(MyClass(1337)));
    return 0;
}

这不适用于 GCC 4.6,而它曾经在以前的版本中工作。

现在它说:获取 xvalue 的地址(右值引用)。

有什么方法可以安全地将右值的地址传递给另一个函数?

【问题讨论】:

  • an rvalue reference (a.k.a. address of temporary) 一个不一样
  • “我想要更好地理解即将到来的标准。”你到底要从中得到什么理解呢?也许你应该问你真正的问题,你真正想学的东西,而不是这个关于你不想做的事情的问题。
  • 我试图把这个问题浓缩成我认为你想知道的本质。 然而这种解释可能相当宽松,所以请查看我的编辑(如果您愿意,可以回滚)。恐怕这可能会使当前的答案看起来有点脱节。

标签: c++ gcc c++11 rvalue


【解决方案1】:

是:无论如何都可以安全地将右值引用(也称为临时地址)传递给另一个函数,而无需将其无聊地存储在变量中吗?

是的,有,就像在下一个例子中一样:

#include <iostream>

class MyClass {
       public: MyClass(int a) : a(a) { }
       int a;
   };


void print(MyClass&& a) { std::cout << a.a << std::endl; }

int main() {
    print( MyClass(1337) );
}

【讨论】:

    【解决方案2】:

    右值不一定有地址。但是,有一种方法可以获得您想要的效果,通过利用将右值绑定到引用强制它是临时的(确实有一个地址)的事实:

    template<typename T> T *addressOfTemporary(T &&v) { return &v; }
    

    在这个函数中,v 是一个左值(尽管被声明为T&amp;&amp;),所以可以获取它的地址。您可以按如下方式使用此功能:

    class MyClass {
        public: MyClass(int a) : a(a) { }
        int a;
    };
    
    #include <iostream>
    void print(MyClass* a) { std::cout << a->a << std::endl; }
    
    int main() {
        print(addressOfTemporary(MyClass(1337)));
        return 0;
    }
    

    请注意,临时的生命周期在完整表达式(在本例中为 print(...) 表达式)的末尾结束,因此您需要注意不要在该点之后使用指针。

    【讨论】:

      【解决方案3】:

      如果您并不特别需要打印右值,您可以使用标准的 const 引用来代替:

      class MyClass {
           public: MyClass(int a) : a(a) { }
           int a; 
      };  
      
      #include <iostream> 
      
      void print(const MyClass& a) 
      { std::cout << a.a << std::endl; }  
      
      int main() {
           print(MyClass(1337));
           return 0;
      } 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-15
        • 1970-01-01
        • 2017-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多