c++ 对 'my_map[i] = my_map.size()' 的作用

What c++ do for `my_map[i] = my_map.size()`?

本文关键字:map my 作用 size c++      更新时间:2023-10-16
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++17以来...

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

。将导致my_map[0]0.

C++17补充说:

在每一个简单的赋值表达式中E1 = E2和每个复合赋值表达式E1 @= E2、每个值计算和边E2的效果在每次值计算和侧之前排序E1的影响 .

这里没有序列点,因此未指定求值顺序(或者,在 C++11 行话中,两个表达式是不确定的序列(。my_map[0]的值是0还是1,具体取决于实现。

  • 如果首先评估,my_map[0]将增加大小,导致my_map.size()评估为1。 然后my_map[0] 1.
  • 但是,如果首先评估my_map.size(),则将0 my_map[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。