以下向量声明:
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 帖子得出的结论是,这是 gcc 4.7 版本中的错误,或者在编译中没有提到-std=c++11
标志。
我的 gcc 版本是 7.3.0,我用上面的标志编译。
只是出于好奇和狭隘的希望,我试图用list
替换vector
,并得到了类似的错误。
如果您需要使用这些字符组成的单个std::string
初始化std::string
的std::vector
,则需要一个额外的大括号初始值设定项:
vector<string> valid_escape = {{'n', 't', 'r', '0', '\'}};
内大括号将使用给定字符初始化字符串,外大括号将使用索引 0 处的字符串构造一个向量。
如果你想要一个包含多个std::string
的std::vector
,每个都用一个字符初始化
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', '\'};