2012-02-16 4 views
12

Il seguente codice compila e fa la "cosa giusta":In che modo boost :: variant store reference?

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

Come si fa boost :: negozio variante un punto di riferimento? Secondo lo standard C++, il modo in cui i riferimenti sono memorizzati è completamente fino al compilatore. In realtà, in che modo lo boost::variant sa quanti byte è occupato da un riferimento? sizeof(T&) == sizeof(T), quindi non può utilizzare l'operatore sizeof(). Ora, so che i riferimenti sono probabilmente implementati come indicatori, ma non c'è alcuna garanzia nella lingua. Una buona spiegazione di come funziona la funzione get<> e la visita quando la variante sta memorizzando i riferimenti ottengono punti extra :)

+10

Incastrandoli in un oggetto. '<< sizeof (std :: vector &), sizeof (std :: vector ), sizeof (T); struct T {std :: vector & r;}; '56, 56, 8 –

risposta

6

È possibile dichiarare campi della struct come riferimenti.

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

Si può prendere l'sizeof(ref_to_int), che è 8 sul mio x64 con gcc. Il campo memorizza il riferimento.