【发布时间】:2014-03-07 22:57:25
【问题描述】:
以下代码是否会导致未定义的行为?
std::map<int, vector<int>> foo()
{
return ...
}
BOOST_FOREACH(const int& i, foo()[42])
{
std::cout << i << std::endl;
}
如果未定义,修复它的好方法是什么?如果我使用 c++11 range-for 循环而不是 BOOST_FOREACH 会怎样?
【问题讨论】:
-
你觉得这里为什么会有UB?
-
我看到类似代码中的内存损坏。但不确定是不是因为这种用法。
-
查看sourcecode。似乎有一些宏魔法可以检测参数是否为右值,在这种情况下,它会复制参数。
-
@user2079303:不幸的是,
std::map<...>::operator[]返回一个左值引用(到一个临时对象中);不是 r 值;因此,map临时的生命周期没有正确延长,我们最终得到了对下界的引用。
标签: c++ loops c++11 rvalue boost-foreach