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