2011-02-06 15 views
2

で:ベクトル::この定義を考えると、参照

vector<some_struct_t> lots_of_stuff; 

そして​​は参照を返し、このコードは、私には理にかなっているという事実:

some_struct_t & ref_element = lots_of_stuff.at(0); 

しかし、このコードもコンパイルしているようです作業する:

some_struct_t val_element = lots_of_stuff.at(0); 

ここで非参照作業はできますか?コピーコンストラクタが呼び出されていますか?なぜこれは機能しますか?

答えて

0

タイプTの参照は、型Tの変数の名前はT.だから、の左辺値表現であると同じように、単にタイプTの左辺値式で、...

vector<T> v = ...; 
T a = ...; 
T b = a; 
T c = v.at(0); 

どのようにほとんど差がありますbとcは初期化されます。これは、右辺が単なるT型の左辺式であり、コピー初期化につながるからです。

私はこの質問をする理由は、ポインタの型がオブジェクト型であるように参照自体がオブジェクト型であると考えることだと思います。しかし、そうではありません。式neverには参照型があります。参照型は単にrvalueを左辺値式に変換するために使用されます。式の型は同じです。しかし、その "価値カテゴリー"の変化。

6

非参照オブジェクトは、返された参照からオブジェクトへのコピーを行います。オブジェクトへの変更は、参照バージョンと同じように、ベクター内のオブジェクトに適用されません。

+0

+1。私はあなたがこれについてもっと光を当てようとしたことに気にしないことを願っています。 – sellibitze

+0

問題ありません。より多くの詳細だけがそれを良くする –