为了账号安全,请及时绑定邮箱和手机立即绑定

使独特和完美的转发

使独特和完美的转发

C++
三国纷争 2019-07-05 12:54:11
使独特和完美的转发为什么没有std::make_unique标准C+11库中的函数模板?我发现std::unique_ptr<SomeUserDefinedType> p(new SomeUserDefinedType(1, 2, 3));有点冗长。下面这些不是更好吗?auto p = std::make_unique<SomeUserDefinedType>(1, 2, 3);这隐藏了new很好,只提到过一次类型。无论如何,下面是我试图实现的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::forward需要编译的东西,但我不确定它是否正确。是吗?究竟是什么std::forward<Args>(args)...刻薄?编译器对此有何看法?
查看完整描述

3 回答

?
慕妹3242003

TA贡献1824条经验 获得超6个赞

不错,但是Stephan T.Lavavej(更著名的名字是STL)有一个更好的解决方案make_unique,它对数组版本正确工作。

#include <memory>#include <type_traits>#include <utility>template <typename T, typename... Args>std:
:unique_ptr<T> make_unique_helper(std::false_type, Args&&... args) {
  return std::unique_ptr<T>(new T(std::forward<Args>(args)...));}template <typename T, typename... Args>std:
  :unique_ptr<T> make_unique_helper(std::true_type, Args&&... args) {
   static_assert(std::extent<T>::value == 0,
       "make_unique<T[N]>() is forbidden, please use make_unique<T[]>().");

   typedef typename std::remove_extent<T>::type U;
   return std::unique_ptr<T>(new U[sizeof...(Args)]{std::forward<Args>(args)...});}template <typename T, typename...
    Args>std::unique_ptr<T> make_unique(Args&&... args) {
   return make_unique_helper<T>(std::is_array<T>(), std::forward<Args>(args)...);}

这是可以看到的他的核心C+6视频.

STL版本make_UNIQUE的更新版本现在可作为N 3656..这个版本被收养变成草案C+14。


查看完整回答
反对 回复 2019-07-05
?
aluckdog

TA贡献1847条经验 获得超7个赞

std::make_shared不只是简写std::shared_ptr<Type> ptr(new Type(...));..它做了一些你不可能不用它就行。

为了完成它的任务,std::shared_ptr除了保存实际指针的存储空间之外,还必须分配跟踪块。但是,因为std::make_shared分配实际对象时,有可能std::make_shared分配两个对象同一内存块中的跟踪块。

所以当std::shared_ptr<Type> ptr = new Type(...);将是两个内存分配(一个用于new,一个在std::shared_ptr跟踪块),std::make_shared<Type>(...)会分配记忆块。

的许多潜在用户来说,这是很重要的。std::shared_ptr..唯一的一件事std::make_unique这样做会稍微方便一些。仅此而已。


查看完整回答
反对 回复 2019-07-05
  • 3 回答
  • 0 关注
  • 342 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信