c++ 对 'my_map[i] = my_map.size()' 的作用
What c++ do for `my_map[i] = my_map.size()`?
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。
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 使用一个考虑到std::map中键值的滚动或换行的键
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 允许从 std::map 的密钥窃取资源?
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将重物插入std::map
- 使用通用值初始化 std::map,不重复
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- C++:当所有条目都保证是唯一时,替代 std::map
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- 使用字符数组作为 Map 中的键
- C++如何创建 std::map
- C++ equivalent to Java Map getOrDefault?
- 从其他容器中移动构造"std::map"
- 如何使用 uint64_t 键类型从 std::map<int, std::string> 返回值?
- 将 std::map::emplace 与返回 shared_ptr 的函数一起使用是否正确?
- C++中 std::map 的运行时复杂度是多少?
- 为什么在 std::map 上移动无法将元素从一个映射移动到另一个映射