Как добавляются ссылки boost:: variant store?
Следующий код компилирует и делает "правильную вещь":
#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;
}
Как boost:: variant хранит ссылку? Согласно стандарту С++, как хранятся ссылки, полностью зависит от компилятора. Собственно, как boost::variant
даже знать, сколько байтов занято ссылкой? sizeof(T&) == sizeof(T)
, поэтому он не может использовать оператор sizeof()
. Теперь я знаю, что ссылки, скорее всего, реализованы как указатели, но на этом языке нет никакой гарантии. Хорошее объяснение того, как get<>
и посещение работают, когда вариант хранит ссылки, получают дополнительные баллы:)
Ответы
Ответ 1
Вы можете объявлять поля структуры в качестве ссылок.
struct ref_to_int {
ref_to_int(int& init)
: _storage(init) {} // _storage stores the reference.
private:
int& _storage;
};
Вы можете взять sizeof(ref_to_int)
, который 8
на моем x64 с gcc. Поле хранит ссылку.