CppCoreGuidelines F.60 如果参数可以是空的话, T* 比 T& 更合适
12 July 2022
F.60: Prefer T*
over T&
when “no argument” is a valid option
理由
指针(T*)可以是 nullptr
而引用(T&)不可以。没有空引用这一说。有时
nullptr
是有效参数,表示“无对象”。除了这种情况,最好都用引用。因为用引用代码更好更简单。
例子
#include <gsl/gsl> using namespace gsl; // zstring is a char*; that is a C-style string string zstring_to_string(zstring<> p) { // p might be nullptr; remember to check if (!p) return string{}; return string{p}; } void print(const vector<int>& r) { // r refers to a vector<int>; no check needed for_each(begin(r), end(r), [](int x){cout << x;}); } int main() { auto ss = zstring<>("abc"); cout << zstring_to_string(ss) << endl; print(vector<int>{}); print(vector<int>{1,2,3}); return 0; }
abc 123
注意
可以在C++编造出一个空指针 nullptr
的引用。这种错误很少见。
int* p = nullptr; int& pp = *p; cout << p;
0
如果你更喜欢指针操作(->
和 *
),not_null<T*>
可以提供类似T&
那样的保障。