【问题标题】:std::initializer_list ambiguity in Visual StudioVisual Studio 中的 std::initializer_list 歧义
【发布时间】:2016-02-21 20:12:14
【问题描述】:

我正在尝试将 std::initializer_list 接受为这样的通用构造函数:

template<typename T>
class Test{
  std::vector<T> V;

  Test(std::initializer_list<T>& list) : V(list){}

};

使用

Test<int> test{ 1, 2, 3, 4 };

但我得到了错误:

error C2440: 'initializing' : cannot convert from 'initializer-list' to 'Test<int>' No constructor could take the source type, or constructor overload resolution was ambiguous

我只是不确定我在这里做错了什么。

【问题讨论】:

  • VS 看起来已经成熟了,不错。它似乎不再允许将“&”绑定到临时对象。
  • 刻薄,但我会接受的。谢谢。

标签: c++ templates constructor initializer-list


【解决方案1】:
Test(std::initializer_list<T>& list) : V(list){}

这通过非常量引用获取std::initializer_list,但您随后尝试将临时绑定到它,这是非法的

std::initializer_list 被设计成轻量级的,所以你可以直接传值:

Test(std::initializer_list<T> list) : V(list){}
//                           ^ no &

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 2020-06-11
    相关资源
    最近更新 更多