当我将它推送到std :: vector push_back时,std :: move会破坏我的对象

Ord*_*rdo 0 c++ move c++11 visual-studio-2012

我在制作应用程序时遇到了一些麻烦.当你将它移动到向量后推时,std :: move会破坏你的对象.这是一个小例子:

#include <string>
#include <iostream>
#include <vector>

using namespace std;

class FileSetting
{
private:
    FileSetting(FileSetting &fileSetting) { cout << "Copy\n"; }
public:
    FileSetting(std::string name, void * value, int size) { cout << "Create\n"; }
    FileSetting(FileSetting &&fileSetting) { cout << "Move\n"; }
    ~FileSetting() { cout << "Destroy\n"; }

    void test() { cout << "Test\n"; }
};

int main()
{
    vector<FileSetting> settings;
    {
        char * test = "test";
        FileSetting setting("test", test, strlen(test) * sizeof(char)); 
        settings.push_back(std::move(setting)); 
    }

    settings[0].test();

    cout << "Done!\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出将是:

  • 创建
  • 移动
  • 破坏
  • 测试
  • 完成!
  • 破坏

如何在FileSetting超出范围时确保仅调用destroy,而不是在我移动它时调用destroy.我试图避免指针.

Rei*_*ica 5

std::move()不破坏对象.你得到的"毁灭"是setting超出范围.

  • @Ordo"移动"一个对象并不会从堆栈中神奇地传输它.该对象仍然存在.只是移动允许您从对象"窃取"重型资源.移动操作(ctor,赋值操作)必须仍然使对象处于有效状态. (4认同)