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

Could not convert from ‘<brace-enclosed initializer list>’ to vector

以下向量声明:

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,我用上面的flag编译的。

出于好奇和狭隘的希望,我尝试用 list 替换 vector 并得到了类似的错误。

如果你需要 std::vectorstd::string 由这些字符组成的单个 std::string 初始化,你需要一个额外的大括号初始化器:

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

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

如果您想要一个 std::vector 包含几个 std::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)

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

试试这个:

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

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

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