2012-02-16 9 views
12

次のコードはコンパイルされ、「正しいこと」を行います。boost :: variantストアはどのように参照しますか?

#include <boost/variant.hpp> 
#include <iostream> 

int main() 
{ 
    int a = 10; 
    boost::variant<int&, float&> x = a; 
    a = 20; 
    std::cout << boost::get<int&>(x) << "\n"; 
    return 0; 
} 

がどのように後押しん::バリアントストアの参照を? C++標準によれば、参照がどのように格納されるかは完全にコンパイラによって異なります。実際には、boost::variantは、どのように多くのバイトが参照によって占有されるかを知っていますか? sizeof(T&) == sizeof(T)ですので、sizeof()演算子を使用することはできません。今、私は参照がポインタとして実装されている可能性が高いことを知っていますが、その言語での保証はありません。バリアントが参照を格納しているときにget<>と訪問がどのようにして追加のポイントを得るかについての良い説明:)

+10

オブジェクトにラッピングすることによって。 '<< sizeof(std :: vector &)、sizeof(std :: vector )、sizeof(T);構造体T {std :: vector & r;}; '56,56,8 –

答えて

6

参照として構造体フィールドを宣言できます。

struct ref_to_int { 
    ref_to_int(int& init) 
     : _storage(init) {} // _storage stores the reference. 
private: 
    int& _storage; 
}; 

あなたはgccで私のx64の上8である、sizeof(ref_to_int)を取ることができます。フィールドには参照が格納されます。

関連する問題