3

(間違った C++ 用語を使用している場合は、この投稿を編集してください。私は完全な C++ 初心者です。)

Objective-Cのnull可能性は、Objective-C++クラスのC++オブジェクトでどのように機能しますか?

たとえば、次の型と関数があるとします。

typedef struct
{
    const Foo* fooArray;
    uint32_t fooArrayLength;

} FooList;

uint32_t GetFoo(const std::string& bar, std::shared_ptr<const FooList>& result);

このように再定義することは合法GetFooですか?

uint32_t GetFoo(const std::string& _Nonnull bar, std::shared_ptr<const FooList _Nullable>& _Nonnull result);

このように呼び出した場合、clang または静的アナライザーから警告が表示されGetFooますか?

GetFoo(nil, nil);
4

2 に答える 2

1

Jordan Rose (Apple の Swift チームの)は次のように述べています

参照はポインターではないため、null 可能性はありません。しかし、C++ 標準によれば、refs はすでに NULL になることはありません。

したがって、質問は無意味です。

ただし、ポインタに関しては

[通常のポインターは、C++ と Objective-C++ で引き続き null 可能性を取得します] (ただし、残念ながら、テンプレートには多くの粗いエッジがあります。ObjC++ の null 可能性は優先事項ではありませんでした。)

于 2016-11-30T17:33:41.880 に答える
1

Nullability が意味をなさない 2 つの C++ ケースを選択しました。:-)

  1. Yourconst FooListは非ポインター型であるため、決してnullptr(またはNULL古い C++ コンパイラーでは) できません。

  2. 参照は、どちらにもならないものとして標準で定義されていnullptrます。nullptrはポインタ型であり、 a から参照に移動する唯一の方法はそれを逆参照することなので、これは理にかなっnullptrています。

ただし、null 可能性 (構造体の ) を指定しなかった唯一のケースは、const Foo*実際にはそれが有効な場合です。

少なくとも、Apple のコンパイラで実行している場合は。技術的には、Apple の nullability は Objective-C (およびその拡張により Objective-C++) 標準の一部にすぎないため、コンパイラに依存する C++ の非標準拡張です (したがって、先頭のアンダースコアはコンパイラ固有のキーワード用に予約されています)。 )。

NB - パフォーマンス上の理由から、ほとんどの C++ コンパイラはポインタの上にシンタックス シュガーとして参照を実装するだけなので、実際には次のような悪いことを行うことができます。

Foo* myFoo = nullptr;
Foo& myFooRef = *myFoo;

彼らはあなたがnullptr参照を作成したことを知りませんが、それは「未定義」の動作に該当するため、間違ったコードです。ただし、Objective-C++ コンパイラが現在 C++ 参照の null 可能性を分析しているかどうかはわかりません。簡単なテストでは、Apple は少なくともそうではないことが示されています。静的アナライザーがそれをキャッチするかどうかもわかりません。

PS - 上記のコードをコンパイルしようとすると_Nullable、非ポインター型での (sic) の使用に関するエラーが発生するはずです。

于 2016-12-20T17:35:33.527 に答える