Подтвердить что ты не робот

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

4b9b3361

Ответ 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. Поле хранит ссылку.