2012-02-16 61 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 – 2012-02-16 01:38:30

回答

6

您可以声明结构域作为引用。

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

您可以乘坐sizeof(ref_to_int),这是8在我的x64与海湾合作委员会。该字段存储参考。