14

次のコードはコンパイルされ、「正しいこと」を実行します。

#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<>バリアントが参照を保存しているときに訪問がどのように機能するかについての良い説明は、追加のポイントを獲得します:)

4

1 に答える 1

7

構造体フィールドを参照として宣言できます。

struct ref_to_int {
    ref_to_int(int& init)
      : _storage(init) {} // _storage stores the reference.
private:
    int& _storage;
};

gcc を使用して x64 にsizeof(ref_to_int)ある を使用できます。8フィールドには参照が格納されます。

于 2014-01-16T12:42:07.597 に答える