12 July 2022

C++ 核心指南目录

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&那样的保障。