4
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 的地址(右值引用)。

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

4

3 回答 3

4

是:无论如何都可以安全地将右值引用(又名临时地址)传递给另一个函数,而无需将其无聊地存储在变量中只是为了做到这一点?

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

#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) );
}
于 2012-03-20T11:56:49.387 回答
2

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

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

于 2012-03-23T06:01:41.197 回答
1

如果您不需要特别打印 rvalues only,您可以使用标准的 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;
} 
于 2012-03-20T12:29:46.270 回答