uni*_*uni 5 c++ implicit-conversion
我有一个可以隐式转换为函数可接受的类型的结构std::map::insert()。
我按原样使用结构,但出现编译错误:
没有重载函数可以转换所有参数类型
但是,如果我使用显式转换结构static_cast,它会被接受。
我的问题是,为什么隐式转换在这里不起作用?
示例代码:
struct MyStruct
{
MyStruct(std::string s, int i) : data(s, i) {}
operator std::pair<std::string, int>() const
{
return data;
}
private:
std::pair<std::string, int> data;
};
MyStruct my_val1("hello", 4);
MyStruct my_val2("world", 2);
std::map<std::string, int> my_map {};
my_map.insert(static_cast<std::pair<std::string, int>>(my_val1)); // compiles
my_map.insert(my_val2); // not compiles
Run Code Online (Sandbox Code Playgroud)
Nat*_*ica 14
您的问题是isvalue_type的问题,与转换运算符的问题不同。my_mapstd::pair<const std::string, int>std::pair<std::string, int>
这意味着转换my_val2需要两个用户定义的转换1才能到达std::pair<const std::string, int>,但在隐式转换序列中最多只允许有一个用户定义的转换。
这static_cast是一种显式强制转换,因此只有一个隐式的用户定义转换从std::pair<std::string, int>到std::pair<const std::string, int>。
将运算符更改为operator std::pair<const std::string, int>() const将允许编译,如本实例my_map.insert(my_val2);所示。
1:甚至标准库类型也被认为是用户定义的。非用户定义类型是核心语言支持的类型,例如int.