具体来说,我想知道为什么这会编译:
#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
^
答案 0 :(得分:2)
std::make_unique<T>(args...)
期望从T
构建args...
。
std::unique_ptr<T>(p)
期望p
为T *
类型的拥有值。
请注意,您的唯一指针会为const char **
而不是const char *
建模。所以在(1)中你创建一个新的,动态分配的char指针,其值从s
复制,而在(2)中你试图创建一个从某事物中取得所有权的唯一指针,但是你&# 39;重新传递一个错误类型的构造函数参数。