0

私のコードには、std::map次のようなものがあります。

std::map<std::string, A*> myMap;

ここで、Aは私のカスタムクラスの1つです。

このように存在しないマップ要素にアクセスすると、次のoperator[]ようになります。

std::string s("hello");
A* pA = myMap[s];

そのキーで新しい要素が作成されることは知っていますが、ポインターをNULLに初期化したいと思います。つまり、myMap[s]存在する場合は、有効なポインタを返す必要があります。そうでない場合は、上記のコードの実行後にpAをNULLにします。

デフォルトでは、myMap[s]終了しない場合、pAにはガベージが含まれますか?要素が終了しない場合にpAに値NULLが含まれるようにするにはどうすればよいですか?

4

2 に答える 2

3

nullptr簡単な回答:はい、ポインタは、事前の値がない新しいキールックアップで確実に見なすことができます。

長い答え:

標準によると:

C ++11§23.4.4.3、p5

T& operator[](key_type&& x);

効果:マップにxに相当するキーがない場合は、マップに挿入value_type(std::move(x), T())します。

特に、の使用に注意してT()くださいT。この場合はポインタタイプです。これはにつながります...

C ++11§8.5、p10

初期化子が空の括弧のセット、つまり()であるオブジェクトは、値で初期化されます。

値の初期化の定義による:

C ++11§8.5、p7

タイプTのオブジェクトを値初期化するということは、次のことを意味します。

  • Tがユーザー提供のコンストラクター(12.1)を持つ(おそらくcv修飾された)クラスタイプ(条項9)の場合、Tのデフォルトコンストラクターが呼び出されます(Tにアクセス可能なデフォルトコンストラクターがない場合、初期化は不正な形式になります) ;

  • Tがユーザー提供のコンストラクターのない(おそらくcv修飾された)非ユニオンクラスタイプである場合、オブジェクトはゼロで初期化され、Tの暗黙的に宣言されたデフォルトコンストラクターが自明でない場合、そのコンストラクターが呼び出されます。

  • Tが配列型の場合、各要素は値で初期化されます。

  • それ以外の場合、オブジェクトはゼロで初期化されます。

これにより、オブジェクトタイプがゼロで初期化されることの意味がわかります。

C ++11§8.5、p5

タイプTのオブジェクトまたは参照をゼロで初期化するということは、次のことを意味します。

  • Tがスカラー型(3.9)の場合、オブジェクトは値0(ゼロ)に設定され、積分定数式と見なされ、T (103)に変換されます。

  • Tが(おそらくcv修飾された)非ユニオンクラスタイプである場合、各非静的データメンバーと各基本クラスサブオブジェクトはゼロで初期化され、パディングはゼロビットに初期化されます。

  • Tが(おそらくcv修飾された)共用体型である場合、オブジェクトの最初の非静的な名前付きデータメンバーはゼロで初期化され、パディングはゼロビットに初期化されます。

  • Tが配列型の場合、各要素はゼロで初期化されます。

  • Tが参照型の場合、初期化は実行されません。

103)4.10で指定されているように、値が0の整数定数式をポインター型に変換すると、ポインター値がnullになります。

于 2013-02-26T03:36:09.240 に答える
2

はい、intやpointerなどの埋め込み型のマップ内の新しい要素はゼロで初期化されるため、ポインターはNULLになります。

于 2013-02-26T03:24:56.720 に答える