c++ 装pair的vector,emplace_back与++运算符顺序问题

vector<pair<int, int>> list;
int a = 0;
list.emplace_back(a, a++);

以上代码为啥list末尾插入的结果是{1, 0}?
如果++是前一个的后缀,即:list.emplace_back(a++, a); 则list末尾插入的是{0, 1}。

引用 皆我百晓生 小程序回复内容作答:
这是因为在 list.emplace_back(a, a++) 中,a 作为函数的参数传递时,可能先计算 a++ 之后再传递参数 a。这意味着 a++ 的结果在 emplace_back 函数执行之前就已经被改变了。

所以,实际发生的顺序是:

  1. a 被传递给 emplace_back 函数,并被保存在 pair 的第一个元素中;
  2. a++ 被执行,将 a 的值从0增加到1。

因此,emplace_back 执行时,第一个元素是0,第二个元素是1,导致最终的结果是 {1, 0}

你使用了UB代码, C++从没有保证函数参数的求值顺序, 如果有教材教你这么干, 扔掉, 免得祸害日后的同僚.

【以下回答由 GPT 生成】

在这段代码中,list.emplace_back(a, a++)会导致list末尾插入的结果是{1, 0}。这是因为在C++中,在函数调用时,具有多个参数的函数的参数求值顺序是未定义的,也就是说,编译器无法保证参数的求值顺序。

对于list.emplace_back(a, a++)这个语句来说,首先会拷贝a值作为pair的第一个元素,然后a会自增。但是,具有多个参数的函数的参数求值顺序是未定义的,所以在这里不能保证a++在a之前执行。

根据未定义行为,可以有不同的结果。在这个例子中,很可能是先拷贝a值作为pair的第一个元素(此时a是0),然后a自增(此时a变成了1),最后将a(此时a是1)作为pair的第二个元素。

如果你希望得到结果{0, 0},可以使用后缀运算符++,即list.emplace_back(a++, a);。这样可以保证a会先拷贝作为pair的第一个元素,然后再自增。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^