为什么我可以使用make_unique创建带有衰减数组指针的unique_ptr?

时间:2015-12-06 12:47:23

标签: c++ c++11 c++14 unique-ptr

具体来说,我想知道为什么这会编译:

#include <memory>
#include "make_unique.hpp"
void foo(const char *s){
   std::unique_ptr<const char*>ptr = std::make_unique<const char*>(s);
}

而这不是:

#include <memory>
#include "make_unique.hpp"
void foo(const char *s){
   std::unique_ptr<const char*>ptr(s);
}

当我在make_unique实现中编写它时似乎正在工作:

#include <memory>
#include "make_unique.hpp"
#include <iostream>
std::unique_ptr<const char*> foo(const char *s){
   /* return std::make_unique<const char*>(s); */
   return std::unique_ptr<const char*>(new decltype(s)(std::forward<decltype(s)>(s)));
}
int main(){
    const char * s = "bar";
    std::unique_ptr<const char*>ptr = foo(s);
    std::cout<<*ptr;

}

编辑*错误(截断)

 error: no matching conversion for functional-style cast from 'const char *' to 'std::unique_ptr<const char *>'
   return std::unique_ptr<const char*>(s);
          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/unique_ptr.h:169:7: note: candidate constructor not viable: no known
      conversion from 'const char *' to 'pointer' (aka 'const char **') for 1st argument; take the address of the argument with &
      unique_ptr(pointer __p) noexcept
      ^

1 个答案:

答案 0 :(得分:2)

  1. std::make_unique<T>(args...)期望从T构建args...

  2. std::unique_ptr<T>(p)期望pT *类型的拥有值。

  3. 请注意,您的唯一指针会为const char **而不是const char *建模。所以在(1)中你创建一个新的,动态分配的char指针,其值从s复制,而在(2)中你试图创建一个从某事物中取得所有权的唯一指针,但是你&# 39;重新传递一个错误类型的构造函数参数。