2012-02-16 5 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); struct 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 내 64에 8sizeof(ref_to_int)를 취할 수 있습니다. 이 필드는 참조를 저장합니다.

관련 문제