我已经编写 C++ 一段时间了,我开始怀疑是否应该在任何地方都应用尽可能使用引用的规则。
与这篇相关的 SO 帖子不同,我对不同类型的事物感兴趣。
以我的经验,参考/指针混合会弄乱您的代码:
std::vector<Foo *> &x = get_from_somewhere(); // OK? reference as return value
some_func_pass_by_ref(x); // OK reference argument and reference variable
some_func_by_pointer(x[4]); // OK pointer arg, pointer value
some_func_pass_elem_by_ref(*x[5]); // BAD: pointer value, reference argument
some_func_that_requires_vec_ptr(&x); // BAD: reference value, pointer argument
一种选择是替换&
为* const
like Foo &
withFoo * const
void some_func_by_ref(const std::vector<Foo * const> * const); // BAD: verbose!
这样至少遍历消失了。const
而我重写函数头已经消失了,因为所有参数都将是指针......以污染代码而不是指针算术(主要是&
and *
)为代价。
我想知道如何以及何时应用尽可能使用引用的规则。
考虑:
- 函数原型的最小重写(即:哦,该死的我需要重写很多原型,因为我想把这个引用的元素放入容器中)
提高可读性
- 避免应用
*
转换Foo*
为Foo&
,反之亦然 - 避免过多的 const 使用,如
* const
- 避免应用
注意:我想到的一件事是每当我打算将元素放入STL容器时使用指针(参见 boost::ref)
我不认为这是 C++03 特有的,但如果 C++11 解决方案可以向后移植到 C++03(即:NRVO 而不是移动语义),则它们很好。