2

私は次のものを持っているとします:

boost::unordered_map< string , someValueType > map;
someValueType& value = map[ "key" ] = someValueType();

最後の行には次が含まれます。

  • の一時的に構築されたインスタンスsomeValueType
  • 新しいマップ エントリへの一時的な割り当て
  • マップ エントリへの参照の初期化

したがって、次の行が次の場合:

   value.someProperty = 42;

これはマップエントリを正しく変更しようとしますか? 元の一時的ではありませんか?

この場合、非 const であるために参照が一時的に取得できないかどうかはわかっています (したがって、コンパイラ エラーまたは 1 つがない場合、私の質問に答えることができます) が、const を参照宣言に追加した場合、そうではありませんこの場合、評価ルールが何を言うかを確認してください

4

1 に答える 1

4

それは本当だ。右側に代入式を使用した初期化があります。

someValueType & value = (map["key"] = someValueType());

実際、これは次と同等です。

someValueType & value = map["key"];

これは、[]そのキーの要素がまだ存在しない場合、 -operator が新しい要素を作成するためです。

マップ エントリを const 参照にバインドしても違いはありません。ただし、キーが存在することが保証されていることがわかっている場合は、マップ自体への定数参照しかない場合でも、マップされた値への const 参照をバインドできます。

void (MapType const & m)
{
    someValueType const & = m.find("key")->second;
}

終了イテレータを逆参照するため、キーが存在しない場合、これはもちろんエラーになります。

于 2012-03-28T21:02:51.423 に答える