使用常量引用进行赋值
Using a const-reference for assignment
我正在尝试遵循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 引用,但是当你定义输出值时,请使用指针。 这是为了让使用者清楚地知道你的函数期望什么。 常量强制执行您不会更改指针的承诺。
- 标准库类型的赋值运算符的引用限定符
- 移动赋值运算符;尝试引用已删除的函数.我该如何解决这个问题?
- 为什么我需要三个嵌套的大括号来调用赋值运算符,将const引用到二维数组
- 复制引用结构上的赋值
- 作为赋值(增加引用变量)C++的左操作数所需的左值
- 如果类在 C++ 中具有常量或引用类型的非静态数据成员,为什么编译器不提供默认赋值运算符?
- 返回 T 引用的 Const 函子禁止赋值
- 为什么在C++中,内建赋值返回的是非常量引用而不是常量引用
- 输入迭代器是否可以仅在赋值的右侧符号上取消引用?
- 为什么类的赋值运算符的返回类型通常是非常量(而不是常量)引用?
- 引用模板类型的赋值运算符需要非常量重载
- 为什么在取消引用的指向接口的指针上使用赋值运算符不是编译器错误
- 为什么 GCC 拒绝复制赋值操作中的常量引用
- 赋值不起作用,但带有取消引用运算符的地址起作用?
- 为引用元组赋值
- 如何为具有自引用指针的类实现复制构造函数/赋值运算符
- 为什么 Visual C++ 编译器允许临时赋值到左值引用
- 常量引用向量向量<向量<long>>赋值不编译
- 通过解引用NULL指针来赋值引用
- Shared_ptr赋值:引用计数顺序