假设我有一个按值返回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。

我尝试在其他各种编译器上运行它,结果如下:
  • Visual Studio 2008(不带STLport5.2)-崩溃
  • Visual Studio 2008(带有STLPort5.2)-Works
  • Visual Studio 2013(不含STLport5.2)-崩溃
  • GCC 4.3.6(不带STLPort5.2)-Works
  • Clang 3.0(不带STLPort5.2)-Works

  • (从http://melpon.org/wandbox/使用了GCC和Clang)

    现在我的问题是
  • 哪种实现是正确的(按照标准)?
  • 为什么在VS以外的所有实现上都成功?
  • 最佳答案



    大概都是。



    这是未定义行为,因为您正在取消引用无效的迭代器。因此,它可能会以无数种方式失败。或似乎起作用,这只是另一种失败方式。

    关于c++ - 临时容器对象上的迭代器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28337846/

    10-11 19:10