c++ - 使用转换运算符初始化 map

标签 c++ implicit-conversion initializer-list

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

#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 中的转换运算符不能在花括号初始化列表中隐式应用?还是其他原因?

最佳答案

请注意 std::map 的关键部分是常量,所以 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_); }

代码可以正常工作。

关于c++ - 使用转换运算符初始化 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40360311/

相关文章:

c# - 如何允许我的类在 C# 中隐式转换为字符串?

c# - 如何在 C# 中返回隐式缩小和扩大的 UInt?

c++ - 初始化列表构造和静态断言

c++ - 为什么在 VS2019 中 std::initializer_list 的初始化似乎失败了

c++ - 什么时候为类成员释放使用 alloca 分配的内存?

c++ - std::initializer 列表全局/静态对象的生命周期

c - MISRA - 禁止转换复杂整数表达式 : Signed versus Unsigned

c++ - 使用 C++ 发现 ONVIF IP 摄像机

c++ - GLib - C++ 中的主事件循环

c++ - C++ STL中的set和hashset有什么区别?