如何在 C++ 中支撑自定义 class 的初始化向量?

how to brace initialize vector of custom class in C++?

有这个简单的代码:

#include <iostream>
#include <vector>
#include <string>

class Person{
public:
    Person(std::string const& name) : name(name) {}
    std::string const& getName() const {
        return name;
    }
private:
    std::string name;
};

int main(){
//    std::vector<int> ar = {1,2,3};
    std::vector<Person> persons = {"John", "David", "Peter"};
}

我遇到错误:

could not convert ‘{"John", "David", "Peter"}’ from ‘<brace-enclosed initializer list>’ to ‘std::vector<Person>’

那么为什么 int 的向量可以进行大括号初始化,而带有隐式构造函数(带有 std::string)的自定义 class 却不能?以及如何启用它?

您可以添加另一个接受 const char* 的构造函数到您的 class,它应该可以工作

class Person{
public:
    Person(const char* name): Person(std::string(name)) {}
    Person(std::string const& name) : name(name) {}
    std::string const& getName() const {
        return name;
    }
private:
    std::string name;
};

或其他答案中建议的附加括号。

你只需要更多牙套:

std::vector<Person> persons = {
    {"John"}, {"David"}, {"Peter"}
};

问题是您在初始化列表中使用了 (C-style) 个字符串文字,但向量包含 std::string。解决此问题的一种方法是传递 std::string 个对象。这是一种方法:

int main(){
    using namespace std::string_literals;
    std::vector<Person> persons = {"John"s, "David"s, "Peter"s};
}

或者,您可以为每个对象使用大括号初始值设定项,如另一个答案中所建议的:

int main(){
    std::vector<Person> persons = {{"John"}, {"David"}, {"Peter"}};
}