我已经编写 C++ 有一段时间了,我开始怀疑这个规则尽可能使用参考文献应该到处应用。
Unlike 这个相关的SO帖子 https://stackoverflow.com/questions/7058339/c-when-to-use-references-vs-pointers我对不同的事情感兴趣。
根据我的经验,引用/指针混合会弄乱您的代码:
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
一种选择是更换&
with * const
like Foo &
with Foo * const
void some_func_by_ref(const std::vector<Foo * const> * const); // BAD: verbose!
这样至少遍历就消失了。我重写函数头已经消失了,因为所有参数都将是指针......代价是污染代码const
而不是指针算术(主要是&
and *
).
我想知道how and when你申请尽可能使用参考文献 rule.
考虑到:
- 最小程度地重写函数原型(即:天哪,我需要重写很多原型,因为我想将此引用的元素放入容器中)
-
增加可读性
- 避免应用
*
转变Foo*
to Foo&
反之亦然
- 避免过度使用 const,如
* const
NOTES:我想到的一件事是,每当我打算将元素放入STL https://stackoverflow.com/questions/7707842/stl-containers-with-reference-to-objects容器(参见 boost::ref)
我不认为这是 C++03 特有的东西,但如果 C++11 解决方案可以向后移植到 C++03(即:NRVO 而不是 move-semantics),那么它们就很好。