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

时间:2016-11-30 15:48:02

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

(如果我使用不正确的C ++术语,请编辑此帖子。我是一个完整的C ++ noob。)

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);

2 个答案:

答案 0 :(得分:1)

Jordan Rose(Apple的Swift团队)says

  

引用不是指针,因此它们不具有可空性。但根据C ++标准,refs可能永远不会为NULL。

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

然而,regarding pointers

  

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

答案 1 :(得分:1)

你已经选择了Nullability毫无意义的两个C ++案例。 : - )

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

  2. 标准将参考文献定义为从不nullptr。这是有道理的,因为nullptr是一个指针类型,从nullptr转到引用的唯一方法是取消引用它,嗯,没有人知道当你取消引用null时会发生什么指针。

  3. 但是,唯一没有指定可空性(结构中的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)时出错。