C ++编译器中的奇怪行为 - 优化?

时间:2016-12-07 14:05:01

标签: c++ optimization compilation g++ g++4.8

我有一个函数,如果元素从地图中删除,则返回true,否则返回false。以下是我的函数定义:

template <class Key, class Value>
bool HashMap<Key, Value>::remove(Key k)
{
  int result = map.erase(k);
  return (result == 1);
}

当我试图检查它是否有效时,我发现了非常奇怪的行为。

当我尝试使用以下语法打印结果时:

cout << boolalpha << students.remove("Sam") << " | " << students.remove("Sam") endl;

根据我的知识打印false | true应该是true | false。然后我尝试使用另一种方法打印它:

bool b1 = students.remove("Sam");
bool b2 = students.remove("Sam");

cout << boolalpha << b1 << " | " << b2 << endl;

这打印了预期的结果 - &gt; true | false。我想这是编译器优化代码的一个技巧。但猜测总是不对的吗? (我正在使用g++ 4.8.5编译器)

谁能告诉我这里发生了什么?

2 个答案:

答案 0 :(得分:6)

函数调用期间参数评估的顺序未指定。 This applies to std::cout as well,因为std::cout << a << b;只是

的简写符号
operator<<(operator<<(std::cout, a), b);

答案 1 :(得分:4)

评估顺序未指定(cfr。order of evaluation)和函数调用(实际上是)

$ curl -sL toolbox.vapor.sh | bash

虽然已定义,但

cout << boolalpha << students.remove("Sam") << " | " << students.remove("Sam") endl;