我正在尝试使用具有不同重载函数的初始化列表,如下面的示例代码所示。似乎 bool 重载和数组重载与映射重载具有排他性的存在主义。
#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] 该行为是意外的。这种奇怪行为的原因是什么以及如何解决?
最佳答案
编译器不知道 {"1", Spam()}
是 std::pair
或 Spam
。
尝试用 std::make_pair()
包裹它们。
Spam({std::make_pair("1", Spam()),
std::make_pair("2", Spam())
});
关于c++ - 将 std::initializer_list 与 bool 重载函数一起使用时重载决议的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29328390/