haz*_*zer 2 c++ memory unique-ptr c++11 c++17
我已经阅读了许多类似问题的答案,但仍然找不到解决我的问题的方法。
我有结构:
struct Param {
std::string name;
std::unique_ptr<Object> default_val;
};
Run Code Online (Sandbox Code Playgroud)
Function我有一个存储 s 向量的类Param。我在某个地方创建了这个参数的向量,并需要将其传递给Function构造函数。
问题出在我尝试将向量传递给构造函数的那一刻。我知道我需要移动所有的unique_ptr东西,我就这么做了。
也许我错过了一些非常简单的事情?
Code snippets
这Function:
using Params = std::vector<Param>;
class Callable : public Object {
public:
Callable(const Params & params) : params(params) {}
// ...
private:
Params params;
}
Run Code Online (Sandbox Code Playgroud)
我创建向量的代码:
Params params;
for(auto & p : func_decl->params){
auto default_val = eval(p.default_val.get());
Param p(p.id->get_name(), std::move(default_val));
params.push_back(std::move(p));
}
Run Code Online (Sandbox Code Playgroud)
这里可以不使用吗shared_ptr?
输出是:
error: use of deleted function 'Param::Param(const Param&)'
Param不可复制,因为其成员之一不可复制。由于向量与其内容一样可复制,因此 的向量Param不可复制。
当你这样做时:
Callable(const Params & params) : params(params) {}
Run Code Online (Sandbox Code Playgroud)
您正在尝试使用向量的复制构造函数。那不会编译。
您需要移动输入向量,这将同时移动其内容。这意味着更改构造函数,使其采用右值引用,并用于std::move移动向量。
Callable(Params&& params) : params(std::move(params)) {}
Run Code Online (Sandbox Code Playgroud)