由于 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 循环中,如第一个示例所示,似乎很容易犯此错误。