为什么在函数内部初始化时 C++ 对象会被破坏?我能做些什么来防止它?

Say*_*yan 3 c++ temporary-objects

在这里,当我推入堆栈时,为什么对象会被销毁?

#include <iostream>
#include <stack>

class One
{
private:
        int i;
public:
        One(int i) {this->i = i;}
        ~One() {std::cout << "value " << this->i << " is destroyed\n";}
};

int main()
{
        std::stack<One> stack;
        stack.push(One(1));
        stack.push(One(2));

        std::cout << "Now I'll stop\n";
}
Run Code Online (Sandbox Code Playgroud)

我之前预计不会看到任何输出Now I'll stop。但我明白了

value 1 is destroyed
value 2 is destroyed
Now I'll stop
value 1 is destroyed
value 2 is destroyed
Run Code Online (Sandbox Code Playgroud)

如果我想防止它们被破坏,我该怎么办?

son*_*yao 12

One(1)One(2)构造两个临时对象,将它们传递给push然后复制(移动)到stack. 临时表在完整表达式后立即销毁。

如果您想避免构建临时文件,您可以emplace改用。

将新元素压入堆栈顶部。该元素是就地构造的,即不执行复制或移动操作。

例如

stack.emplace(1);
stack.emplace(2);
Run Code Online (Sandbox Code Playgroud)

  • @Wolf [返回值](https://en.cppreference.com/w/cpp/container/stack/emplace#Return_value) 与 C++17 不同。 (2认同)