std::map<int, int> my_map;
my_map[0] = my_map.size();
Run Code Online (Sandbox Code Playgroud)
那么,将my_map[0]是0或1,或未定义?
除非您的编译器提供保证,否则无论如何都不能保证.C++标准没有.
如果您需要my_map.operator [](0)先评估然后写:
int& m0 = my_map[0];
m0 = my_map.size();
Run Code Online (Sandbox Code Playgroud)
如果您my_map.size()首先需要评估,那么写:
int s = my_map.size();
my_map[0] = s;
Run Code Online (Sandbox Code Playgroud)
这里没有序列点,因此评估顺序未指定(或者,在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();
Run Code Online (Sandbox Code Playgroud)
...或者,对于像第二个这样的行为,
int sz = my_map.size();
my_map[0] = sz;
Run Code Online (Sandbox Code Playgroud)
确保upvote Oo Tiib是第一个演示如何为表达式引入排序的人:-)