C++11 使用std::unique\u ptr作为隐式值创建std::pair或std::map
此代码在Visual Studio中工作:C++11 使用std::unique\u ptr作为隐式值创建std::pair或std::map,c++11,stdmap,std-pair,C++11,Stdmap,Std Pair,此代码在Visual Studio中工作: typedef struct { int a; } data_t; using datap_t = std::unique_ptr<data_t>; using MyPair = std::pair<std::string, datap_t>; int main() { data_t * pd1 = new data_t(); MyPair p("tst", pd1); // This does no
typedef struct {
int a;
} data_t;
using datap_t = std::unique_ptr<data_t>;
using MyPair = std::pair<std::string, datap_t>;
int main() {
data_t * pd1 = new data_t();
MyPair p("tst", pd1); // This does not compile in gcc or clang
// MyPair p2("tst", datap_t(pd1)); // This compiles
return 0;
}
typedef结构{
INTA;
}数据;
使用datap_t=std::unique_ptr;
使用MyPair=std::pair;
int main(){
data_t*pd1=新数据_t();
MyPair p(“tst”,pd1);//这不在gcc或clang中编译
//MyPair p2(“tst”,datap_t(pd1));//编译
返回0;
}
但clang和gcc给出了错误:
error: no matching function for call to 'std::pair<const std::basic_string<char>, std::unique_ptr<data_t> >::pair(const char [3], data_t*&)
错误:调用'std::pair::pair(const char[3],data_t*&]时没有匹配的函数
是要尝试的表意文字
事实上,我可以调用datap\u t(pd1)
并编译它,这意味着构造函数是有效的,那么为什么该模板找不到合适的匹配项呢
我希望使用emplace将键值对添加到地图中,这就是为什么我首先希望进行这种隐式转换。请注意,与Visual Studio一样,隐式转换也适用于大多数其他类型,例如std::string
中的“原始字符串”
看起来相关,但它谈论的是一个固定的错误,而且非常古老。将单个原始指针作为输入的
std::unique_ptr
构造函数标记为explicit
,以防止隐式转换
pd1
是一个原始指针<代码>MyPair p(“tst”,pd1)涉及到到到std::unique_ptr的隐式转换,这就是编译在Clang和GCC中失败的原因。您必须改用显式转换:
MyPair p("tst", datap_t(pd1));
更好的选择是根本不使用原始指针:
MyPair p("tst", std::make_unique<data_t>());
MyPair p(“tst”,std::make_unique());
Clang和GCC做的是正确的,Visual Studio没有(尽管它显示相关的构造函数是显式的)。采用单个原始指针作为输入的
std::unique_ptr
构造函数被标记为显式的
,以防止隐式转换
pd1
是一个原始指针<代码>MyPair p(“tst”,pd1)涉及到到到std::unique_ptr的隐式转换,这就是编译在Clang和GCC中失败的原因。您必须改用显式转换:
MyPair p("tst", datap_t(pd1));
更好的选择是根本不使用原始指针:
MyPair p("tst", std::make_unique<data_t>());
MyPair p(“tst”,std::make_unique());
Clang和GCC做的是正确的,Visual Studio没有(尽管它显示相关的构造函数是显式的。不要使用原始指针
auto pd1=std::make_unique()
@kfsone我不知道,当处理外部C库时,处理原始指针是不可避免的。另外,我很想知道为什么这在VisualStudio中可以工作,而不是叮当作响,也不想知道如何使它工作:)不要使用原始指针auto pd1=std::make_unique()
@kfsone我不知道,当处理外部C库时,处理原始指针是不可避免的。另外,我很想知道为什么这在VisualStudio中有效,而不是clang,而不是寻找如何使其有效:)