gpt4 book ai didi

objective-c++ - Objective-C++ 中 C++ 对象的可空性规则

转载 作者:行者123 更新时间:2023-12-04 03:16:00 27 4
gpt4 key购买 nike

(如果我使用了不正确的 C++ 术语,请编辑这篇文章。我是一个彻头彻尾的 C++ 菜鸟。)

如何Objective-C nullability在 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);

如果我这样调用 GetFoo,是否会从 clang 或静态分析器收到任何警告?

GetFoo(nil, nil);

最佳答案

您已经选择了可空性毫无意义的两个 C++ 案例。 :-)

  1. 您的 const FooList 是非指针类型,因此永远不能是 nullptr(或 NULL 在旧的 C++ 编译器上) .

  2. 引用由标准定义为永远不会是 nullptr。这是有道理的,因为 nullptr 是指针类型,从 nullptr 到引用的唯一方法是取消引用它,这......好吧,没人知道是什么当您取消引用空指针时会发生这种情况。

但是,您没有指定可空性(结构中的 const Foo*)的唯一情况实际上是有效的。

至少如果您在 Apple 的编译器上运行。从技术上讲,Apple 的可空性只是 Objective-C(以及扩展的 Objective-C++)标准的一部分,因此是依赖于编译器的 C++ 的非标准扩展(因此其开头的下划线是为特定于编译器的关键字保留的).

注意 - 出于性能原因,大多数 C++ 编译器只是将引用实现为指针之上的语法糖,因此在实践中,您可以做一些邪恶的事情,例如

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

而且他们不会知道您刚刚创建了一个 nullptr 引用,但那属于“未定义”行为,因此是错误的代码。但是,我不知道目前是否有任何 Objective-C++ 编译器分析 C++ 引用的可空性。快速测试表明 Apple 至少没有。也不确定静态分析器是否捕获了它。

PS - 如果您尝试编译上述代码,您应该会收到关于在非指针类型上使用 _Nullable (sic) 的错误。

关于objective-c++ - Objective-C++ 中 C++ 对象的可空性规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40892529/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com