使用std::initializer_list构造对象向量

编程语言 2026-07-12

我正在尝试按如下方式初始化一个对象向量 Col
Col 类是使用一个 std::string 元素构造的。

为什么在我直接把 std::initializer_list<std::string> 传给 vector 时,下面的代码会编译失败?

如果我使用迭代器来构造对象向量,效果就没问题。

#include <initializer_list>
#include <vector>
#include <string>

class Col {
    std::string m_name;

    public:
        explicit Col(const std::string& any_name) : m_name(any_name) {}
};

void foo(std::initializer_list<std::string> data) {
    std::vector<Col> v(data);
}

void bar(std::initializer_list<std::string> data) {
    std::vector<Col> v(data.begin(), data.end());
}

我正在使用 Visual Studio 2022,并且使用 C++17 进行编译。

我遇到的错误是:

error C2665: 'std::vector<Col,std::allocator<Col>>::vector':
no overloaded function could convert all the argument types

cannot convert argument 1 from 'std::initializer_list<std::string>' to 'std::initializer_list<_Ty>
 with
[
 _Ty=Dictionary::Col,
 _Alloc=std::allocator<Dictionary::Col>
]

解决方案

你试图用一个由 std::string 构成的初始化列表来创建一个包含 Col 的向量。不存在从 std::initializer_list<std::string> 转换到一个 std::initializer_list<Col> 的隐式转换,尽管存在从 std::string 转换到 Col 的转换。这就是使用迭代器构造函数可行(从 std::string 转换到 Col 的转换),而不适用于接受初始化列表的构造函数的原因。

一般来说,除了都是 X 的实例化外,X<T>X<U> 之间并不存在隐式关系。例如,也不存在从 std::vector<std::string> 直接转换到 std::vector<Col> 的转换(尽管你可以用指向字符串向量的迭代器来构造一个 std::vector<Col>)。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章