C++ std::move(std::unique_ptr())组合是否有标准缩写?
我终于可以将代码库迁移到C++11了,这将产生更短更好的代码 然而,我发现当我使用新指针调用函数时,它比以前长了很多: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!
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>());