gpt4 book ai didi

c++ - 临时容器对象上的迭代器

转载 作者:行者123 更新时间:2023-12-02 03:10:07 24 4
gpt4 key购买 nike

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

当我看到这段代码时,我觉得它不应该工作,因为我们在临时对象上使用迭代器,该对象将在执行表达式后被删除。但是,令我惊讶的是它确实有效。

这适用于 STLPort5.2 和 Microsoft Visual Studio 2008。

后来,当我们删除 STLPort 并开始使用编译器提供的 STL 实现时,我们开始面临崩溃。

据透露,上面的代码不适用于 VS 2008 列表实现,但适用于 STLPort。

我尝试在其他各种编译器上运行它,结果如下,

  • Visual Studio 2008(没有 STLport5.2)- 崩溃
  • Visual Studio 2008(带有 STLPort5.2)- 可以使用
  • Visual Studio 2013(没有 STLport5.2)- 崩溃
  • GCC 4.3.6(没有 STLPort5.2)- 可以使用
  • Clang 3.0(没有 STLPort5.2)- 有效

(GCC 和 Clang 从 http://melpon.org/wandbox/ 开始使用)

现在我的问题是,

  1. 哪种实现是正确的(根据标准)?
  2. 为什么它在 VS 之外的所有实现上都能成功?

最佳答案

  1. Which implementation is correct(as per standard)?

大概是全部。

  1. Why it succeeds on all implementations other that VS?

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com