我正在尝试使用具有不同重载函数的初始化列表,如下面的示例代码所示。似乎布尔重载和数组重载具有映射重载的独占存在主义。
#include <string>
struct Spam
{
Spam();
Spam(bool flag); //(1)
Spam(const std::initializer_list<std::pair<const std::string, Spam > > & il); //(2)
Spam(const std::initializer_list<Spam > & il); //(3)
};
int main()
{
Spam({ { "1", Spam() }, { "2", Spam() } });
}
这意味着在上面的代码中,Spam(bool flag)
和Spam(const std::initializer_list<Spam > & il)
在使用初始化列表Spam(const std::initializer_list<std::pair<const std::string, Spam > > & il)
的映射版本时不能共存。编译抱怨
error C2440: '<function-style-cast>' : cannot convert from 'initializer-list' to 'Spam'
最初使用VC12观察到此行为,稍后使用G++ [See Demo]和Clang [See Demo]复制此行为 这种行为是出乎意料的这种奇怪行为的原因是什么以及如何解决?
答案 0 :(得分:0)
编译器不知道{"1", Spam()}
是std::pair
或Spam
。
尝试用std::make_pair()
包装它们。
Spam({std::make_pair("1", Spam()),
std::make_pair("2", Spam())
});