2017-01-29 13 views
0

私はC++を学んでいます。 私はコピーを避けるために私達に参照を学んだ。 私はその要素を上書きするために参照としてベクトルのイテレータを取得しようとしました。C++でiteratorを参照として取得できないのはなぜですか?

// simplified function 
std::vector<int>::iterator& GetIterator(std::vector<int>& vec) { 
    return vec.begin(); // compiler said that here is an error. 
} 

コンパイラがエラーメッセージを表示し、const参照を使用するように指示します。 私はconstを使いたくないです。 非const参照を取得できないのはなぜですか? イテレータのコピーを避けるには? ありがとうございます。

+3

'vec.begin()'は値で返します。その参照が参照するものについて考えてみましょう。 – juanchopanza

+1

正確なエラーメッセージは何ですか? –

+0

イテレータをコピーしないのはなぜですか? – melpomene

答えて

2

にそれをバインドすることはできません&intのようなものです - しかし、ここではコピーが必要。 vec.begin()の結果は、関数が戻るときに一時的に存在しなくなります。関数外の値を必要とする場合は、コピーが必要です。 (ここで参照を作成することに成功した場合、それは良いことではない「ダングリングリファレンス」になります。)

いずれの場合も、効率的にコピーするように設計されています。イテレータは、 。実際、コンパイラは、何もしなくても、あなたのためにコピーを避けることができます。これがそのケースの1つです。

したがって、参照のないコードは、より簡単で、正確で、既に最適です。

+0

私はメカニズムと方法を教えてくれてありがとう。 – mora

1

vec.begin();一時オブジェクトを返します。これはr値です。 l値参照をr値にバインドすることはできません。 GetIteratorの機能から復帰した後、その一時的なオブジェクトは破壊され、あなたの参照はぶら下がります。

参考資料の代わりに値(std::vector<int>::iterator)で返信してください。 Iteratorはコピー可能で安価にコピーできるように設計されています。また、コンパイラは、オブジェクトに対処するコストを避けるために、戻り値最適化を使用します。

+0

私のコードが間違っていて、どうやっているのか教えてくれてありがとう。あなたの指示ははっきりとしていました。 – mora

+0

@MRB *は一時オブジェクトを返し、r値参照*です。それは右辺値ではなく、ただの値です。 – vsoftco

+0

@vsoftcoありがとうございます。あなたが正しいです。 – MRB

0

正しいコード

std::vector<int>::iterator GetIterator(std::vector<int>& vec) { 
    return vec.begin(); // compiler said that here is an error. 
} 

あなた&は余分です。

イテレータはint*のようになり、アドレスとなります。
そしてstd::vector<type>::iteratorはそうです。
のでvector.begin()はそうあなたがあなたは時々コピーを避けるために、参照を使用することができますiterator&

+1

コードを修正する方法を教えてくれてありがとう。 – mora

関連する問題