使用转换运算符初始化地图

Using conversion operator to initialize a map

是什么阻止了此初始化工作?

#include <map>
using std::map; using std::pair; using std::make_pair;
struct P {
    char a_, b_;
    P(char a, char b) : a_{a}, b_{b} {}
    operator pair<char,char>() { return make_pair(a_, b_); }
};
int main() {
    map<char,char> qmap { P( 'a','b' ) };
}

看起来 P 中的转换运算符不能隐式应用到花括号初始化列表中?还是其他原因?

注意astd::map的key部分是const,所以std::map<char, char>的元素类型是std::pair<const char, char>;这里的类型不匹配。返回的带大括号的std::pair<char, char>不能用来构造std::initializer_list<std::pair<const char, char>>,(再构造std::map<char, char>)。

如果改成

operator pair<const char,char>() { return make_pair(a_, b_); }

operator std::map<char, char>::value_type () { return make_pair(a_, b_); }

代码可以正常工作。

可以,但是你忘记了重点:mapvalue_type实际上是pair<const Key, Value>,所以在你的例子中你需要两次转换(Ppair<char, char>pair<char const, char>) 去见你的 qmapvalue_type。这是规则允许的另一种转换。

如果您将转换运算符更改为

operator pair<char const,char>() { return make_pair(a_, b_); }

你的代码compiles.