使用 operator[] 插入时不同的 std::map 大小(vc++ vs g++)

AMA*_*AMA 4 c++ gcc stdmap visual-c++ language-lawyer

这段代码

#include <iostream>
#include <map>

int main()
{
    std::map<int, std::size_t> m;
    m[0] = m.size();
    std::cout << m[0] << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

将打印0VC ++1G ++

  • 这个代码有效吗?
  • 如果是,哪个编译器是正确的?
  • 直觉上我会期待1。vc++ 的结局如何0

son*_*yao 7

从 C++17 开始,求值的顺序是有保证的,m.size()排在前面m[0];结果保证是0

  1. 在每个简单赋值表达式 E1=E2 和每个复合赋值表达式 E1@=E2 中,E2 的每个值计算和副作用都在 E1 的每个值计算和副作用之前排序

在 C++17 之前,行为是unspecified

顺便说一句,您可以使用Gcc C++17 modeGcc C++14 mode观察不同的行为。

  • 在 C++17 之前,行为未指定,但并非未定义。`m[0]` 和 `m.size()` 都是函数调用。他们的身体执行不能重叠。即使它们的调用站点没有排序,情况也是如此。 (5认同)