2012-02-16 22 views
12

Aşağıdaki kod derler ve "doğru olanı" yapar:Boost :: variant mağaza referansları nasıldır?

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

Nasıl arttırmakla kalmaz :: varyant mağaza referans? C++ standardına göre, referansların nasıl depolandığı tamamen derleyiciye aittir. Aslında, boost::variant, bir referans ile kaç bayta kaç tane olduğunu bilebilir? sizeof(T&) == sizeof(T), dolayısıyla sizeof() işlecini kullanamaz. Şimdi, referansların büyük olasılıkla işaretçiler olarak kullanıldığını biliyorum, ancak dilde garanti yoktur. get<> ve ziyaretçinin referansları saklarken nasıl çalıştığını iyi bir şekilde açıklayın.

+10

Bir nesneyi sarmalayarak. '<< sizeof (std :: vektör &), sizeof (std :: vektör ), sizeof (T); struct T {std :: vektör & r;}; '56, 56, 8 –

cevap

6

Yapı alanlarını referans olarak bildirebilirsiniz.

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

Sen gcc ile benim x 64 8 olduğunu sizeof(ref_to_int), alabilir. Alan referansı saklar.