【发布时间】:2015-06-02 09:59:57
【问题描述】:
我正在尝试使用具有不同重载函数的初始化列表,如下面的示例代码所示。看来布尔重载和数组重载与映射重载有着排他的存在主义。
#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] 中被复制 行为出乎意料。这种奇怪行为的原因是什么以及如何解决?
【问题讨论】:
标签: c++ c++11 language-lawyer initializer-list overloading