Следующий код компилирует и делает "правильную вещь":
#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<>
и посещение работают, когда вариант хранит ссылки, получают дополнительные баллы:)