获取右值的地址

时间:2012-03-20 11:52:11

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

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(rvalue reference)的地址。

有没有办法安全地将右值的地址传递给另一个函数?

3 个答案:

答案 0 :(得分:3)

  

是:无论如何要安全地将右值引用(临时的a.k.a.地址)传递给另一个函数,而不是将它存储在一个变量中就可以了吗?

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

#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) );
}

答案 1 :(得分:2)

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

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

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

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(...)表达式),因此您需要注意指针在该点之后未被使用。

答案 2 :(得分:1)

如果您不需要仅打印rvalues ,则可以改为使用标准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;
}