【问题标题】:Using a const-reference for assignment使用 const-reference 进行赋值
【发布时间】:2013-10-25 09:40:45
【问题描述】:

我正在尝试遵循 Google C++ 风格指南,特别是 the section on reference arguments。它说总是将引用作为 const 引用传递。这似乎是个好主意,因为我不希望这个函数与我的FilterBank 混淆。但是,在 Instrument 中有些地方我需要更改 *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;
}

谢谢!

【问题讨论】:

  • 当您说“..我需要更改filter_...”时,您是指指针还是它指向的对象
  • “我正在尝试遵循 Google C++ 风格指南” -- 为什么?
  • 我的意思是它所指的——谢谢。

标签: c++ styles constants parameter-passing


【解决方案1】:

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

但这种推理是有缺陷的。 set_filter_bank 函数需要能够授予对 filter_ 指针的写访问权限。问题是,一个函数不能授予它自己没有的访问权限。因此,即使该函数不修改对象,它也需要具有修改对象的权限,以便将该权限授予其他人。所以,无论你把它设为引用还是指针,它都不能是 const。

所以,如果你坚持遵循谷歌风格指南,那么这里的适当参数就是一个指针。

【讨论】:

  • 是的,这就是我的意思。谢谢。
【解决方案2】:

在我看来,您提供的链接的“决定”部分对此进行了解释:

决定:

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

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

事实上,在 Google 代码中输入是一个非常严格的约定 参数是值或 const 引用,而输出参数是 指针。输入参数可能是 const 指针,但我们绝不允许 非常量引用参数,除非约定需要, 例如,交换()。

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

在我看来,他们好像在说如果您将输入值传递给函数使用 const 引用,但在定义输出值时使用指针。这是为了让消费者清楚您的功能所期望的。 const 强制执行您不会更改指针的承诺。

【讨论】:

  • 我在使用 Google 样式指南时一直遇到的众多问题之一...强制输出参数为原始指针。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
  • 2015-03-07
  • 1970-01-01
  • 1970-01-01
  • 2016-11-16
相关资源
最近更新 更多