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

j4n*_*nu5 1 c++ stl c++11

考虑:

#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;
}
Run Code Online (Sandbox Code Playgroud)

来自:http://www.cplusplus.com/reference/stack/stack/pop/,"这会调用被删除元素的析构函数".此外,从http://www.cplusplus.com/reference/stack/stack/top/,stack.top()通过引用返回.

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

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

Sto*_*ica 6

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

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

如果您要参考,那将是不确定的 auto& obj = S.top();