2013-08-29 9 views
8

私はQMap::operator[](const Key & key)を持っていることに気づいたこれら2 overloadsQMap :: operator [](const Key&key)が値で返されるのはなぜですか?

T & QMap::operator[](const Key & key) 
const T QMap::operator[](const Key & key) const 

値で返すための理由がありますか?

そして、私たちは移動の意味を持っているので:

値で返すときに、私たちが今までconstの値で返す必要があり

私が求めていた理由はこれです:

想像して、私たちは持っている:それはまだ存在していない場合const場合

class ExpensiveToCopy; 
{ 
public: 
    int someProperty() const; 
    ... 
} 

void f(const QMap<int, ExpensiveToCopy>& map) 
{ 
    int lala = map[4].someProperty(); // We need to copy the entire object 
             // just to look at someProperty(); 
} 
+1

値で* one *オーバーロードのみが返され、もう一方は参照を返します。 –

+2

@ヨアヒムはい、それは私が理解していないことです。彼らは、例えば、std :: vector :: operator []のような参照を返すべきではありませんか? –

+1

@nurettin it * doesはmove semanticsを禁止します。 – juanchopanza

答えて

11

我々はconstマップに要素を追加することはできません、ローカルオブジェクトが返されます。

そうでない場合は、constの場合は、指定されたキー(存在しない場合)に要素が作成され、参照が返されます。

+3

これはまさにそれです。私はちょうど同じ答えを書こうとしていました。 'std :: map'には' const operator [] 'はありません。おそらく良いことです。あまり混乱しない。 – juanchopanza

+0

具体的には、指定されたキーを持つ要素がマップに見つからない場合、 'const'ケースはマップに何も挿入せずに「デフォルト」の構成要素を返すことができなければなりません。したがって、参照を返すことはできません。 – juanchopanza

+0

@juanchopanza静的なローカル変数への参照を返すことができるので、const参照を返すことができます。私が望んでいるかどうかは、別の問題です... – Sjoerd

0

私は非参照と考えていますconstは、クライアントコードが何らかの方法でmapを変更できないようにするためです。 const_cast<ExpensiveToCopy>map[4]などを使用する場合は、map[4]を変更することはできますが、map[4]mapの4番目の要素には適用されません。

関連する問題