C ++ STL堆栈:什么时候pop()安全

时间:2016-11-06 06:40:28

标签: c++ c++11 stl

考虑:

#include <iostream>
#include <stack>

class Abc {
    int x = 5;
    public:
    void display() {
        std::cout << x << std::endl;
    }
};

int main() {
    std::stack<Abc> S;
    S.emplace();

    auto obj = S.top();
    S.pop();
    obj.display();
    return 0;
}

发件人:http://www.cplusplus.com/reference/stack/stack/pop/,&#34;这会调用已删除元素的析构函数&#34;。 此外,从http://www.cplusplus.com/reference/stack/stack/top/开始,stack.top()通过引用返回。

如果S.top()通过引用返回,如果S.pop()破坏了对象,为什么obj.display()失败?

我知道堆栈会调用底层容器的back()pop_back()方法。通过扩展,为什么不会失败?

1 个答案:

答案 0 :(得分:6)

auto obj = S.top(); obj初始化 S.top()。它是当时删除元素的副本。

您的代码段具有明确定义的行为。

如果你要参考auto& obj = S.top();

,那将是未定义的