Как Boost :: вариант хранит ссылки? - PullRequest
13 голосов
/ 16 февраля 2012

Следующий код компилирует и делает "правильные вещи": ​​

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

1 Ответ

6 голосов
/ 16 января 2014

Вы можете объявить структурные поля как ссылки.

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

...