2
std::map<int, int> my_map;
my_map[0] = my_map.size();

では、または、または undefinedにmy_map[0]なりますか?01

4

3 に答える 3

7

コンパイラが保証を提供しない限り、どちらの方法でも保証はありません。C++ 標準にはありません。

my_map.operator [](0)最初に評価する必要がある場合は、次のように記述します。

int& m0 = my_map[0]; 
m0 = my_map.size();

my_map.size()最初に評価が必要な場合は、次のように記述します。

int s = my_map.size();
my_map[0] = s;
于 2012-08-29T00:46:30.660 に答える
6

ここにはシーケンス ポイントがないため、評価順序は指定されていません (または、C++11 の専門用語では、2 つの式の順序は不定です)。my_map[0]is0またはの値は1、実装によって異なります。

  • my_map[0]最初に評価されるとサイズが大きくなり、my_map.size()に評価され1ます。my_map[0]になります1
  • ただし、my_map.size()が最初に評価される場合、 の値はmy_map[0]になります0

さて、上記の動作を明確に定義するにはどうすればよいでしょうか? シーケンス ポイントを導入する必要があります。つまり、一方の式を他方の式の前に並べる必要があります。最初のような振る舞いのために、

int& val = my_map[0];
val = my_map.size();

... または、2 番目のような動作の場合、

int sz = my_map.size();
my_map[0] = sz;

式のシーケンスを導入する方法を最初に示した Oo Tiib に賛成票を投じてください :-)

于 2012-08-29T00:35:41.890 に答える
4

君の

my_map[0] = my_map.size();

と同等です

my_map.operator [](0) = my_map.size();

代入演算子は の組み込み代入ですint

組み込み割り当てのどちら側が最初に評価されるかは指定されていません。このため、0 が割り当てられるか 1 が割り当てられるかは指定されていません。

于 2012-08-29T00:34:12.230 に答える