(如果我使用不正确的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);
答案 0 :(得分:1)
Jordan Rose(Apple的Swift团队)says:
引用不是指针,因此它们不具有可空性。但根据C ++标准,refs可能永远不会为NULL。
所以这个问题没有实际意义。
[常规指针在C ++和Objective-C ++中仍然具有可空性](但不幸的是,模板周围存在很多粗糙的边缘.ObjC ++可空性并不是优先考虑的事项。)
答案 1 :(得分:1)
你已经选择了Nullability毫无意义的两个C ++案例。 : - )
您的const FooList
是非指针类型,因此永远不能是nullptr
(或旧版C ++编译器上的NULL
)。
标准将参考文献定义为从不nullptr
。这是有道理的,因为nullptr
是一个指针类型,从nullptr
转到引用的唯一方法是取消引用它,嗯,没有人知道当你取消引用null时会发生什么指针。
但是,唯一没有指定可空性(结构中的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)时出错。