[英]Please explain why this simple C++(Qt) code works so strange
请解释此代码的行为:
#include <QCoreApplication>
#include <QMap>
int testFunc(const QList<int>& data)
{
// my debugger says data is {0,3}, but I expected {2, 3}. What happened?!
return data.at(0);
}
int main(int argc, char* argv[])
{
QCoreApplication a(argc, argv);
QMap<int, int> test_map;
int x = test_map.value(1, 2); // // x is 2 (OK)
test_map[1] = testFunc(
{
test_map.value(1, 2), // 2
3
});
return 0;
}
从评论中可以看到,我希望函数传递一个包含{2,3}
的数组,但是实际上传递了{0,3}
(由调试器检查,在Linux上使用gcc 6)。
通常,在C ++中未指定表达式的不同子表达式的求值顺序。 在这种情况下,这意味着未指定赋值运算符的哪一侧先被评估。
换句话说,编译器发出先评估test_map[1]
然后再评估testFunc
调用的代码是完全合法的。 当然,如果发生这种情况,那么在评估参数test_map.value(1, 2)
, test_map[1]
已经在映射中创建了映射1 : 0
,因此test_map.value(1, 2)
返回存在的映射值0
而不是使用提供的默认值2
。
请注意,在这种情况下,以上内容仅适用于C ++ 14和更早版本。 从C ++ 17开始,确保对内置赋值运算符的右侧进行评估,然后再评估其左侧,因此在C ++ 17中,您看到的行为无效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.