2012-02-16 4 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; 
}; 

Вы можете взять sizeof(ref_to_int), который 8 на моем 64 с НКУ. Поле хранит ссылку.

Смежные вопросы