c++ - 将 std::initializer_list 与 bool 重载函数一起使用时重载决议的意外行为

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

我正在尝试使用具有不同重载函数的初始化列表,如下面的示例代码所示。似乎 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::pairSpam

尝试用 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/

相关文章:

C++ 标准 : end of lifetime

c++ - 将可变参数模板模板参数专用于最小参数数量 : legal or not?

c++ - 重置std::shared_ptr是否会导致重置其删除程序?

c++ - 在编译时触发 void constexpr?

c++ - 为什么 map 的元素不需要复制或移动构造函数,而 vector 的元素需要?

c++ - finally函数依赖RVO

c++ - C++ 标准是否保证函数返回值具有常量地址?

c++ - 为什么不能重载类模板?

c++ - 链表,对将节点添加到列表头部的函数感到困惑

c++编译: error: expected constructor,析构函数或在 '*'之前进行类型转换