Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::move(std::unique_ptr())组合是否有标准缩写?_C++_C++11 - Fatal编程技术网

C++ std::move(std::unique_ptr())组合是否有标准缩写?

C++ std::move(std::unique_ptr())组合是否有标准缩写?,c++,c++11,C++,C++11,我终于可以将代码库迁移到C++11了,这将产生更短更好的代码 然而,我发现当我使用新指针调用函数时,它比以前长了很多: void addCallback(Callback*); // Takes ownership of callback. // ... addCallback(new Callback); // Clear. 变成 void addCallback(std::unique_ptr<Callback>); // No comment needed now!

我终于可以将代码库迁移到C++11了,这将产生更短更好的代码

然而,我发现当我使用新指针调用函数时,它比以前长了很多:

void addCallback(Callback*);  // Takes ownership of callback.
// ...
addCallback(new Callback);    // Clear.
变成

void addCallback(std::unique_ptr<Callback>);  // No comment needed now!
// ...
addCallback(std::move(std::unique_ptr<Callback>(new Callback)));  // bleh.

它似乎工作得很好,但我肯定是在重新发明轮子?(如果我没有-我的
move\u ptr
或我最后称之为的任何东西是否有任何陷阱或可能的错误?

你的意思是,你想写比这行更简单的东西吗

addCallback(std::move(std::unique_ptr<Callback>(new Callback)));  // bleh.
遗憾的是,没有
std::make_unique()
,但是
make_unique()
很容易编写:

template <typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&& args) {
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
模板
std::unique_ptr使_唯一(Args&&Args){
返回std::unique_ptr(新的T(std::forward(args)…);
}
。。。产生

addCallback(make_unique<Callback>());
addCallback(make_unique());

…您可能希望从
make_unique
中删除
T*ptr
参数)标记为正确!谢谢(真不敢相信我没赶上这一步)。一个缺点-我不相信这会在Visual Studio中工作,因为可变模板-我说的对吗?(我从事跨平台应用程序的工作…@Tom:@tomwhirly:为了鼓励使用
make_unique
(即使编写它很糟糕=]),我要指出,使用
make_unique
不仅仅是为了更清晰,而且更安全。考虑:
foo(std::unique_ptr(新T),std::unique_ptr(新T))std::unique\u ptr
之前,允许编译器对这两个新表达式求值。这意味着,如果第二个
新T
抛出,第一个将实际泄漏,即使您希望智能指针能够工作
make_unique
确保此创建在例外情况下被视为原子:
foo(make_unique(),make_unique())
。为时已晚:-D我已经在使用上面Xeo指向的链接make_unique,所以你正在向唱诗班布道。我将大量原始指针返回替换为唯一的_ptr,只有一两个错误。即使有铿锵声,也有一些新的晦涩难懂的C++错误,但是,我现在已经习惯了。一般情况下,不使用“移动”,而应使用“右值”。因为,据我所知,std::move不移动任何东西,它只是转换为右值。因此,可以将其称为右值ptr,而不是移动ptr。02
template <typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&& args) {
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
addCallback(make_unique<Callback>());