在 Visual Studio 中初始化 std::vector 大小

Initialization of std::vector size in Visual Studio

为什么我无法在 Visual Studio 中初始化 std::vector 大小?

#include <vector>
#include <regex>
#include "Lexer.h" // TokenRule definition

vector<TokenRule> tokenRules(3) = {
    { TokenType::Identifier, regex("[a-zA-Z_][a-zA-Z0-9_]*") },
    { TokenType::Number, regex("[+-]?[0-9]+(\.[0-9]+)?(e[+-]?[0-9]+)?") },
    { TokenType::String, regex("\\"(?:(?=(\\?))\1.)*?\\"") }
};

IntelliSense 类型检查:

std::vector<TokenRule *> tokenRules(3) = {
                                   ^^^^

任何对象只能进行一次初始化 - 您可以执行

std::vector<TokenRule *> tokenRules(3);

这将调用构造函数,声明为 vector(size_type _Count),创建一个包含 3 个默认初始化元素的向量,或者

vector<TokenRule> tokenRules{
{ TokenType::Identifier, regex("[a-zA-Z_][a-zA-Z0-9_]*") },
{ TokenType::Number, regex("[+-]?[0-9]+(\.[0-9]+)?(e[+-]?[0-9]+)?") },
{ TokenType::String, regex("\\"(?:(?=(\\?))\1.)*?\\"") }   };

会调用 vector(initializer_list<value_type> _Ilist) - 完全不同的构造函数。后者是您想要的,因为它将使用 initializer_list 的大小来确定所需的向量大小(在您的情况下为 3)。

请注意,vector<TokenRule*> tokenRules = XXX 几乎是 vector<TokenRule*> tokenRules(XXX) 的语法糖,您不能使用 tokenRules = 3 的唯一原因是 std::vector 明确禁止它。所以在某种程度上你可以说你的代码相当于

std::vector<TokenRule *> tokenRules(3){/*initializer list here*/};

具有 1 个对象的 2 个初始值设定项。希望这会使错误的来源更加清楚。

你也可以

std::vector<TokenRule *> tokenRules(3);
tokenRules = {/*initializer list*/};

虽然这有点多余(并且容易出错),但实际性能损失应该接近 0。