假设我有一个按值返回STL容器的函数,例如std::list
std::list<Foo> get_Foolist()
{
std::list<Foo> lst;
//populate lst
return lst;
}
要么
class SomeClass
{
std::list<Foo> get_Foolist()
{
return m_foolst;
}
...
private:
std::list<Foo> m_foolst;
};
现在,我有一个代码片段,使用该功能来获取列表并以以下方式对其进行迭代,
std::list<Foo>::iterator i = get_Foolist().begin();
//use i like ... cout << *i << endl;
当我看到此代码时,我觉得它不起作用,因为我们在一个临时对象上使用迭代器,该临时对象在执行表达式后将被删除。但是,令我惊讶的是它正在工作。
可以与带有Microsoft Visual Studio 2008的STLPort5.2一起使用。
后来,当我们删除STLPort并开始使用编译器提供的STL实现时,我们开始面临崩溃的危险。
据透露,以上代码不适用于VS 2008列表实现,但适用于STLPort。
我尝试在其他各种编译器上运行它,结果如下:
(从http://melpon.org/wandbox/使用了GCC和Clang)
现在我的问题是
最佳答案
大概都是。
这是未定义行为,因为您正在取消引用无效的迭代器。因此,它可能会以无数种方式失败。或似乎起作用,这只是另一种失败方式。
关于c++ - 临时容器对象上的迭代器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28337846/