13

それは私のコンパイラだけですか、それとも std::vector 要素でコンス参照を使用することは禁止されていますか? 次の構造を検討してください。

struct Y
{
  const int & x;

  Y(const int & p_x):
        x(p_x)
  {
  }
};

今、そのようなオブジェクトをベクトルにプッシュしようとすると:

std::vector<Y> yv;
int x = 5;
Y y(x);
yv.push_back(y);

コンパイラ エラーが表示されます:「エラー: 非静的参照メンバー `const int&Y::x'、既定の代入演算子を使用できません」。コピーctorで十分ではありませんか?

4

6 に答える 6

21

vector要素は割り当て可能でなければなりません。C++ 標準のセクション23.2.4 クラス テンプレート ベクトルから:

...格納されたオブジェクトは、Assignable の要件を満たす必要があります。

于 2012-05-10T09:25:03.440 に答える
12

あなたはチェックしたいかもしれません

std::reference_wrapper

C++11 で利用可能

于 2012-05-10T09:26:52.370 に答える
5

いいえ、 const 参照に割り当てることはできず、STL コンテナーはアイテムを移動するために割り当てを利用するためです。

shared_ptr(boost::またはstd::環境によっては) または生のポインターを使用することをお勧めします。

于 2012-05-10T09:22:56.957 に答える
1

vectorデフォルトでは事前に余分なスロットに要素を構築するため、代入演算子が必要です。

後で、再割り当てする代わりに、代入演算子を使用して、それらのデフォルト インスタンスをベクトルにプッシュしたものに割り当てます。

于 2012-05-10T09:23:20.970 に答える
0

通常、コンテナ内で参照を使用することは禁止されています。これは、たとえばベクトルがフォアハンドでデータを割り当て、参照を(初期化中に)一度だけ割り当てることができるという事実によって正当化できます。

于 2012-05-10T09:23:58.573 に答える