在for循环中使用push_front不会将成员永久添加到列表中

cho*_*obo 1 c++ constructor destructor loops list

我试图在我创建的类的列表上使用push_front()函数.我在for循环中有它,但每当循环将新成员插入到列表中时,它会立即自动销毁,我假设因为它超出了范围.我的问题是如何永久添加这些项目.

例:

class foo
{
public:
    foo(){std::cout << "creation" << std::endl;}
    ~foo(){std::cout << "destruction" << std::endl;}
    bool create() {return true;}
};

int main()
{
    std::list<foo> foolist(4);
    for (std::list<foo>::iterator i=foolist.begin(); i!=foolist.end(); i++)
    {
        foolist.push_front(foo());
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是我得到的输出:

creation
creation
creation
creation
creation
destruction
creation
destruction
creation
destruction
creation
destruction
destruction
destruction
destruction
destruction
destruction
destruction
destruction
destruction
Run Code Online (Sandbox Code Playgroud)

这是我想要实现的目标:

creation
creation
creation
creation
creation
creation
creation
creation
destruction
destruction
destruction
destruction
destruction
destruction
destruction
destruction
Run Code Online (Sandbox Code Playgroud)

Bri*_*ian 5

让我们一次一行地介绍这个程序.

std::list<foo> foolist(4);
Run Code Online (Sandbox Code Playgroud)

foo调用4次的默认构造函数.

foolist.push_front(foo());
Run Code Online (Sandbox Code Playgroud)

该声明运行4次.每次foo都是默认构造的.push_front调用隐式定义的移动构造函数,以便将此临时foo对象移动到列表中.(或者如果你仍处于C++ 03模式,那么复制构造函数.)你没有看到任何打印,因为它不是默认的构造函数.在每次迭代结束时,临时foo被销毁.

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

该列表现在包含8 foo秒,因此析构函数被调用8次.