使用带有布尔重载函数的std :: initializer_list时出现重载决策的意外行为

时间:2015-03-29 11:12:44

标签: c++ c++11 language-lawyer initializer-list overloading

我正在尝试使用具有不同重载函数的初始化列表,如下面的示例代码所示。似乎布尔重载和数组重载具有映射重载的独占存在主义。

#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 个答案:

答案 0 :(得分:0)

编译器不知道{"1", Spam()}std::pairSpam

尝试用std::make_pair()包装它们。

Spam({std::make_pair("1", Spam()),
      std::make_pair("2", Spam())
     });