【发布时间】: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<X>是X*的包装器,而不是X
标签: c++ c++11 c++14 unique-ptr