使用常量引用进行赋值

Using a const-reference for assignment

本文关键字:赋值 引用 常量      更新时间:2023-10-16

我正在尝试遵循Google C++风格指南,特别是关于引用参数的部分。它说始终将引用作为常量引用传递。这似乎是一个好主意,因为我不希望这个函数弄乱我的FilterBank。但是,仪器中有些地方我需要更改*filter_,因此filter_ const 不是一个好的解决方案。这是否意味着我应该传递指针,FilterBank *f?这样做只是风格问题吗?如果需要,无论f是什么,都可以在此函数中进行更改,这就是我试图避免的。

//This code assigns the instrument's filter to some pre-made filter, f
void Instrument::set_filter_bank(FilterBank &f) {
  filter_ = &f;
}

谢谢!

如果我理解正确,您正在尝试允许Instrument类通过成员指针(filter_)修改FilterBank对象。 您可以通过成员函数 set_filter_bank 设置此成员指针。 您不希望此成员函数修改对象,因此希望将其设置为const引用。

但这种推理是有缺陷的。 set_filter_bank函数需要能够授予对filter_指针的写入访问权限。 问题是,函数无法授予它本身没有的访问权限。 因此,即使函数不修改对象,它也需要有权修改对象才能将该权限授予其他人。 因此,无论您将其作为引用还是指针,它都不能是常量。

因此,如果您坚持遵循Google风格指南,那么此处的相应参数是一个指针。

在我看来

,在您给出的链接的"决定"部分中对此进行了解释:

决定:

在函数参数列表中,所有引用都必须是 const:

void Foo(const string &in, string *out);

事实上,这是谷歌代码中一个非常强大的约定,输入 参数是值或常量引用,而输出参数是 指针。输入参数可能是常量指针,但我们从不允许 非常量参考参数,除非约定要求, 例如,swap()。

但是,在某些情况下,最好使用 const T* 到 const T& 用于输入参数。例如:•您要传入 空指针。•该函数保存指向输入的指针或引用。 请记住,大多数时候输入参数将是 指定为 const T&。而是使用 const T* 与 读者认为输入以某种方式被区别对待。所以如果你选择 const T* 而不是 const T&,这样做是有具体原因的;否则 它可能会通过让读者寻找解释来混淆他们 那不存在。

在我看来,他们说如果你将输入值传递给函数,请使用 const 引用,但是当你定义输出值时,请使用指针。 这是为了让使用者清楚地知道你的函数期望什么。 常量强制执行您不会更改指针的承诺。