如何解决使用 operator[] 插入时不同的 std::map 大小vc++ vs g++
此代码
#include <iostream>
#include <map>
int main()
{
std::map<int,std::size_t> m;
m[0] = m.size();
std::cout << m[0] << std::endl;
}
- 此代码有效吗?
- 如果是,哪个编译器是正确的?
- 直觉上,我希望
1
。 vc++ 是如何以0
结尾的?
解决方法
从C++17开始保证order of evaluation,out = df.cummax(1)
Out[80]:
0 1 2 3 4
0 1 1 3 3 5
1 4 4 5 7 8
2 7 7 7 7 9
排在m.size()
之前;结果保证为m[0]
。
- 在每个简单赋值表达式 E1=E2 和每个复合赋值表达式 E1@=E2 中,E2 的每个值计算和副作用都在 E1 的每个值计算和副作用之前进行排序
在 C++17 之前,行为是 unspecified。
顺便说一句,您可以使用 Gcc C++17 mode 和 Gcc C++14 mode 观察不同的行为。
,Assignment operators - cppreference.com
当左操作数具有引用类型时,赋值运算符会修改被引用的对象。
如果左右操作数标识重叠对象,则行为未定义(除非重叠准确且类型相同)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。