考虑:
#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()底层容器的方法.通过扩展,为什么不失败?
auto obj = S.top(); 副本初始化 obj的S.top().它是当时删除元素的副本.
您的代码段具有明确定义的行为.
如果您要参考,那将是不确定的 auto& obj = S.top();