【问题标题】:Why can I create unique_ptr with decayed array pointer using make_unique?为什么我可以使用 make_unique 创建具有衰减数组指针的 unique_ptr?
【发布时间】:2015-12-06 12:47:22
【问题描述】:

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

#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;

}

EDIT* 错误(截断)

 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
      ^

【问题讨论】:

  • 如果您能告诉我们您遇到的实际错误将会很有帮助,因为这可以解释“为什么”。
  • 我认为您指定了一个意外的额外间接级别。 std::unique_ptr&lt;X&gt;X* 的包装器,而不是 X

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


【解决方案1】:
  1. std::make_unique&lt;T&gt;(args...) 期望从args... 构造一个T

  2. std::unique_ptr&lt;T&gt;(p) 期望 pT * 类型的拥有值。

请注意,您的唯一指针模拟的是 const char **,而不是 const char *。因此,在 (1) 中,您创建了一个新的、动态分配的 char 指针,其值从 s 复制而来,而在 (2) 中,您尝试创建一个唯一指针,该指针从某事物中获取所有权,但您传递给它一个类型错误的构造函数参数。

【讨论】:

  • 这在一定程度上帮助我理解了它。 std::unique_ptr 和 std::unique_ptr 之间有实际区别吗?
  • @Mikel:它们是完全不同的东西。前者持有指向T数组第一个元素的指针;后者指向动态分配的T*。这是比较苹果和熊。真正感兴趣的比较是在unique_ptr&lt;T&gt;unique_ptr&lt;T[]&gt; 之间,两者都可以从拥有的T* 构建。
猜你喜欢
  • 2021-12-01
相关资源
最近更新 更多