使用转换运算符初始化地图
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_); }
代码可以正常工作。
可以,但是你忘记了重点:map
的value_type
实际上是pair<const Key, Value>
,所以在你的例子中你需要两次转换(P
⟶ pair<char, char>
⟶ pair<char const, char>
) 去见你的 qmap
的 value_type
。这是规则允许的另一种转换。
如果您将转换运算符更改为
operator pair<char const,char>() { return make_pair(a_, b_); }
你的代码compiles.
是什么阻止了此初始化工作?
#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_); }
代码可以正常工作。
可以,但是你忘记了重点:map
的value_type
实际上是pair<const Key, Value>
,所以在你的例子中你需要两次转换(P
⟶ pair<char, char>
⟶ pair<char const, char>
) 去见你的 qmap
的 value_type
。这是规则允许的另一种转换。
如果您将转换运算符更改为
operator pair<char const,char>() { return make_pair(a_, b_); }
你的代码compiles.