C++ VisualStudio中std::vector大小的初始化
为什么我不能在VisualStudio中初始化std::vector size 包括 包括 include Lexer.h//TokenRule定义 向量标记规则3={ {TokenType::Identifier,regex[a-zA-Z_][a-zA-Z0-9_]*}, {TokenType::Number,正则表达式[+-]?[0-9]+\\.[0-9]+?e[+-]?[0-9]+?}, {TokenType::String,regex\\\?:?=\\\\\?\\1.*\\\} }; IntelliSense类型检查:C++ VisualStudio中std::vector大小的初始化,c++,visual-studio,vector,initialization,size,C++,Visual Studio,Vector,Initialization,Size,为什么我不能在VisualStudio中初始化std::vector size 包括 包括 include Lexer.h//TokenRule定义 向量标记规则3={ {TokenType::Identifier,regex[a-zA-Z_][a-zA-Z0-9_]*}, {TokenType::Number,正则表达式[+-]?[0-9]+\\.[0-9]+?e[+-]?[0-9]+?}, {TokenType::String,regex\\\?:?=\\\\\?\\1.*\\\} }; I
std::vector<TokenRule *> tokenRules(3) = {
^^^^
任何对象只能有一个初始化-您可以
std::vector<TokenRule *> tokenRules(3);
这将调用vectorinitializer\u list\u Ilist-完全不同的构造函数。后者是您想要的,因为在您的情况下,它将使用初始值设定项_list的大小来确定所需的向量大小3
请注意,vector tokenRules=XXX对于vector tokenRulesXXX来说几乎是一种语法糖,您不能执行tokenRules=3的唯一原因是std::vector明确禁止它。所以在某种程度上,你可以说你的代码相当于
std::vector<TokenRule *> tokenRules(3){/*initializer list here*/};
具有1个对象的2个初始值设定项。希望这能使错误的来源更清楚一些
你也可以这样做
std::vector<TokenRule *> tokenRules(3);
tokenRules = {/*initializer list*/};
尽管这有点多余,而且容易出错,但实际的性能损失应该接近0。编译器会怎么说?我可以同时初始化大小和值吗?这取决于要用什么值初始化向量。它们都是相同的值吗?如果是这样,vector有一个用于该目的的双参数构造函数count和value。还是价值观不同?如果是这样,那么使用C++11及更高版本的大括号初始化,或者使用数组或其他容器中的一对迭代器。
std::vector<TokenRule *> tokenRules(3);
tokenRules = {/*initializer list*/};