std::map<int, int> my_map;
my_map[0] = my_map.size();
那么,将my_map[0]
是0
或1
,还是未定义?
除非您的编译器提供保证,否则这两种方式都无法保证。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;
这里没有序列点,因此未指定求值顺序(或者,在 C++11 行话中,这两个表达式是不确定的序列)。的值my_map[0]
是0
或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();
...或者,对于第二个这样的行为,
int sz = my_map.size();
my_map[0] = sz;
确保支持 Oo Tiib 成为第一个演示如何为表达式引入排序的人 :-)
您的
my_map[0] = my_map.size();
相当于
my_map.operator [](0) = my_map.size();
赋值运算符是int
.
未指定首先评估内置赋值的哪一侧。因此,未指定将分配 0 还是 1。