Rust ドキュメント 生成 - C++におけるポインタ変数と参照変数の違いは何ですか?

Rust 比較 / c++ / pointers / reference / c++-faq

リファレンスは、コードを読みやすく書きやすくするための構文上の糖であることは知っています。

S.S. Anne



Answer #1

一般的な意見とは逆に、NULLのリファレンスを持つことは可能です。

int * p = NULL;
int & r = *p;
r = 1;  //クラッシュ!(運が良ければ)

上記の私の例は、短くて作為的なものです。ここでは、もっと現実的な例を紹介します。

class MyClass
{
    ...
    virtual void DoSomething(int,int,int,int,int);
};

void Foo(const MyClass & bar)
{
    ...
    bar.DoSomething(i1,i2,i3,i4,i5);  //メモリアクセス違反が原因でここでクラッシュが発生します-明らかな理由は?
}

MyClass * GetInstance()
{
    if (somecondition)
        return NULL;
    ...
}

MyClass * p = GetInstance();
Foo(*p);

トラブルに巻き込まれないための適切な方法は、NULLポインタを脱参照して参照を作成することを避けることです。これを実現するための自動化された方法をご紹介します。

template<typename T>
T& deref(T* p)
{
    if (p == NULL)
        throw std::invalid_argument(std::string("NULL reference"));
    return *p;
}

MyClass * p = GetInstance();
Foo(deref(p));