Следующий код компилируется и делает «правильные вещи»:
#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 сохраняет ссылку? Согласно стандарту C ++, способ хранения ссылок полностью зависит от компилятора. Собственно, как boost :: variant
вообще узнает, сколько байтов занято ссылкой? sizeof (T &) == sizeof (T)
, поэтому он не может использовать оператор sizeof ()
. Я знаю, что ссылки, скорее всего, реализованы как указатели, но в языке нет гарантии. Хорошее объяснение того, как get <>
и посещение работает, когда вариант хранит ссылки, получают дополнительные баллы :)