c ++为`my_map [i] = my_map.size()`做了什么?

upd*_*liu 2 c++

std::map<int, int> my_map;
my_map[0] = my_map.size();
Run Code Online (Sandbox Code Playgroud)

那么,将my_map[0]01,或未定义?

Öö *_*iib 7

除非您的编译器提供保证,否则无论如何都不能保证.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)

  • 似乎这是好方法......或者为什么你编辑你的答案以包含相同的例子.;) (2认同)

old*_*inb 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();
Run Code Online (Sandbox Code Playgroud)

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

int sz = my_map.size();
my_map[0] = sz;
Run Code Online (Sandbox Code Playgroud)

确保upvote Oo Tiib是第一个演示如何为表达式引入排序的人:-)

  • @Tony Delroy:不,那是不对的.你不断引用不相关的陈述.您对1.9/13的引用是指立即评估,而不是包含在函数中.同时,相关声明在1.9/15中作出.它清楚地表明,来自调用者的不同函数调用是*相对于彼此不确定地排序*(脚注9阐明它意味着函数体的执行不能交错).它还指出内联对排序没有影响.再次:函数*的执行不能*重叠. (2认同)