【问题标题】:Nullability rules for C++ objects in Objective-C++Objective-C++ 中 C++ 对象的可空性规则
【发布时间】:2017-04-15 00:31:46
【问题描述】:

(如果我使用了不正确的 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);

【问题讨论】:

    标签: objective-c++ objective-c-nullability


    【解决方案1】:

    您已经选择了 Nullability 没有意义的两个 C++ 案例。 :-)

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

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

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

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

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

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

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

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

    【讨论】:

    • 非常感谢!我假设您已经发现我并不真正了解 C++。 :)
    【解决方案2】:

    Jordan Rose(Apple Swift 团队成员)says

    引用不是指针,所以它们不能为空。但是根据 C++ 标准,refs 可能永远不会为 NULL。

    所以这个问题没有实际意义。

    但是,regarding pointers

    [常规指针在 C++ 和 Objective-C++ 中仍然可以为空](但不幸的是,模板周围有很多粗糙的边缘。ObjC++ 的可空性并不是优先事项。)

    【讨论】:

      猜你喜欢
      • 2012-05-07
      • 1970-01-01
      • 2012-02-23
      • 1970-01-01
      • 2014-03-24
      • 1970-01-01
      • 2011-08-25
      • 2013-10-04
      • 1970-01-01
      相关资源
      最近更新 更多