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

那么,将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 行话中,这两个表达式是不确定的序列)。的值my_map[0]01取决于实现。

  • 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();

...或者,对于第二个这样的行为,

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 回答