无法从“<brace-enclosed initializer list>”转换为向量

时间:2021-04-07 10:20:02

标签: c++ vector initializer-list

以下向量声明:

vector<string> valid_escape = {'n', 't', 'r', '0', '\\'};  

导致错误:

<块引用>

error: could not convert ‘{'n', 't', 'r', '0', '\\'}’ from ‘<brace-enclosed initializer list>’ to ‘std::vector<std::__cxx11::basic_string<char> >’

关于此问题的其他 SO 帖子得出的结论是,这是 4.7 版 gcc 中的一个错误,或者编译中未提及 -std=c++11 标志。

我的 gcc 版本是 7.3.0,我用上面的标志编译。

出于好奇和狭隘的希望,我尝试将 vector 替换为 list,但遇到了类似的错误。

3 个答案:

答案 0 :(得分:4)

如果您需要使用由这些字符组成的单个 std::vector 初始化 std::stringstd::string,则需要额外的大括号初始化器:

vector<string> valid_escape = {{'n', 't', 'r', '0', '\\'}};

内大括号将用给定的字符初始化一个字符串,外大括号将使用索引为 0 的字符串构造一个向量。

如果您想要一个包含多个 std::vectorstd::string,每个都用一个字符初始化,您需要:

vector<string> valid_escape = {{'n'}, {'t'}, {'r'}, {'0'}, {'\\'}};

std::string 容器没有接受单个字符的构造函数,因此需要一个初始化列表。

示例:

string x = 'a';   // not possible, no constructor exists
string x = "a";   // possible, string(const char* s)
string x = {'a'}; // possible, string(initializer_list<char> il)

答案 1 :(得分:2)

std::string 对象初始化为双 "(双引号),如 "string" 而不是双 '(单引号),如 'n'

试试这个:

std::vector<std::string> valid_escape = {"n", "t", "r", "0", "\\"};

答案 2 :(得分:1)

您可以使用字符串作为字符的容器:

std::string valid_escape = {'n', 't', 'r', '0', '\\'};