我正在编写一个解析器,其中我的代码具有这样的结构(删除了这个问题的所有不重要部分):
class Token
{
private:
char kind;
public:
Token(char kind) : kind(kind) {}
inline char getKind() const {return kind;}
};
class Parser
{
private:
const std::vector<Token>& tokens;
public:
Parser(const std::vector<Token>& tokens) : tokens(tokens) {}
};
&
后面的std::vector<Token>
是无意添加的。结果是以下返回了一个未定义的值:
auto it = tokens.begin();
(*it).getKind();
发现问题后,我删除了
&
,代码按预期工作。我想知道的是const std::vector<Token>& tokens;
到底是做什么的?该代码没有给出任何编译器警告或错误,这是否意味着像这样使用 &
在某些情况下很有用?
将引用变量作为类的成员的情况非常罕见,因为您无法控制所引用对象的生命周期。看来您通过传递临时向量或其他变量创建了
Parser
类的实例,而这些变量在 Parser
尝试使用它时已被销毁。
通过从成员变量声明中删除
&
,您可以强制对象复制传递给构造函数的向量。
另一方面,通过 const 引用传递参数是很常见的,有助于防止生成过多的副本。