2012-03-20 6 views
3
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では機能しません。rvalueのアドレスを取得する

xvalue(rvalue reference)のアドレスを取得しました。

rvalueのアドレスを別の関数に確実に渡す方法はありますか?

+5

タイトルを改善してください。 –

+1

'評価値の参照(別名アドレスの一時的なもの)'は他のものと同じではありません –

+0

rvalue参照:http://thbecker.net/articles/rvalue_references/section_01.html – gbjbaanb

答えて

3

は次のとおりです。安全にうんざりちょうどそれを行うには、変数に格納することなく別の関数に右辺値参照(一時的なの別名、アドレス)を渡すためにとにかくありますか?

はい、次の例のように、そこにある:

#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

あなたはparticualrly のみ右辺値印刷する必要がない場合は、代わりに標準の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; 
} 
2

rvalueに必ずしもアドレスがあるとは限りません。 、この関数内

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

v:しかし、そこにあなたが望む効果を取得する方法は、参照軍への右辺値を結合することは、それが(アドレスを持っていた)一時的なものにするという事実を利用することで、 (T&&と宣言されているにもかかわらず)左辺値なので、そのアドレスを取ることができます。次のようにして、この機能を使用することができますの一時寿命は(この場合には、print(...)式)フル式の終わりで終了することを

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

注意をので、あなたは、ポインタがあることに注意する必要があります。その時点を過ぎては使用されません。

関連する問題