为什么插入到地图时隐式转换不起作用

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.