由于valgrind中出现了一些分段错误和警告信息,我发现这段代码是不正确的,并且在for-range循环中存在某种悬空引用。
#include<numeric>
#include<vector>
auto f(){
std::vector<std::vector<double>> v(10, std::vector<double>(3));
iota(v[5].begin(), v[5].end(), 0);
return v;
}
int main(){
for(auto e : f()[5])
std::cout << e << std::endl;
return 0;
}
似乎begin
和end
来自一个临时的变量并在循环中丢失。当然,一个解决方法是进行以下操作。
auto r = f()[5];
for(auto e : r)
std::cout << e << std::endl;
然而,我想知道为什么for(auto e : f()[5])
是错误的,并且是否有更好的方法来避免这种问题,或者设计f
或容器(std::vector
)以避免这种陷阱。
使用迭代器循环更容易理解为什么会出现这个问题(begin
和end
来自不同的临时对象)
for(auto it = f()[5].begin(); it != f()[5].end(); ++it)
但是在 for-range 循环中,就像第一个例子一样,很容易犯这个错误。