3

(Please edit this post if I use incorrect C++ terms. I'm a total C++ noob.)

How does Objective-C nullability work with C++ objects in an Objective-C++ class?

For example, given the following type and function:

typedef struct
{
    const Foo* fooArray;
    uint32_t fooArrayLength;

} FooList;

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

Is it legal to redefine GetFoo thusly?

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

Will I get any warnings from either clang or the static analyzer if I call GetFoo thusly?

GetFoo(nil, nil);
4

2 回答 2

1

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

  1. const FooList是一个非指针类型,所以永远不可能nullptr(或者NULL在旧的 C++ 编译器上)。

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

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

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

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

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

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

PS - 如果你试图编译上面的代码,你应该得到一个关于_Nullable在非指针类型上使用 (sic) 的错误。

于 2016-12-20T17:35:33.527 回答
1

Jordan Rose(Apple Swift 团队的成员)

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

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

但是,关于指针

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

于 2016-11-30T17:33:41.880 回答