如何在c ++中返回唯一所有权

san*_*nta 0 c++ smart-pointers unique-ptr

我无法std::vector<std::unique_ptr<..>>从函数中移动:MSVC抱怨(C2280)关于尝试引用已删除的函数.

这怎么样?

#include <vector>
#include <iostream>
#include <memory>

using namespace std;

class foo {
public:
   int i;
};

vector<unique_ptr<foo>> test() {
   vector<unique_ptr<foo>> ret{};

   auto f = make_unique<foo>();
   f->i = 1;
   ret.push_back(move(f));

   return move(ret);
}

int main(int argc, char** argv) {
   auto t = test();
   for (auto j : t) {
// fails here: --^
      cout << j->i << endl;
   }

   getchar();
}
Run Code Online (Sandbox Code Playgroud)

完整的错误消息显示:

'std :: unique_ptr> :: unique_ptr(const std :: unique_ptr <_Ty,std :: default_delete <_Ty >>&)':尝试引用已删除的函数

Sto*_*ica 6

它不是功能,它是循环......

for (auto j : t)
Run Code Online (Sandbox Code Playgroud)

...试图依次复制初始化j每个元素t.回想一下,普通auto意味着价值语义.改为使用引用:

for (auto const& j : t)
Run Code Online (Sandbox Code Playgroud)

  • @santa - 防止您意外修改指针本身.我默认支持const-correct代码.严格来说,你没有*在这里使用const引用,这只是一个很好的经验法则. (4认同)