为什么not_null还没有进入C++标准?



在第n次将注释"// not null"添加到原始指针后,我再次想知道not_null模板发生了什么。

c++核心准则是在相当长一段时间之前创建的,现在已经有一些东西被纳入了标准,包括std::span(有些像string_viewstd::array起源于核心准则本身,但有时被合并)。考虑到它的相对简单性,为什么还没有将not_null(或类似的东西)纳入标准?

我定期扫描ISO邮件(但可能不彻底),我甚至没有意识到它的提案。


可能回答了我自己的问题。我不记得遇到过这样的情况,它可以防止代码中的错误,因为我们尽量不这样写代码。

指南本身非常受欢迎,例如clang-tidy和sonar。支持库似乎不太受欢迎。

例如,boost从一开始就作为一个包在Linux上可用。我不知道GSL的任何实现。不过,我认为它是捆绑在windows上的Visual c++的。


既然大家都在评论里问了。

我自己会用它来记录意图。像not_null<>这样的结构可能具有注释所没有的语义价值。强制执行是次要的,尽管我能看到它的位置。这最好是在零开销的情况下完成的(也许在编译时只针对有限的情况)。

我主要考虑的是一个原始指针成员变量的情况。我已经忘记了向函数传递指针的情况,对于这种情况,我总是使用引用来表示非空,也表示"我没有获得所有权"。

同样地(对于类成员),我们也可以记录所有权owned<>not_owned<>

我想还有关联对象是否允许被修改的问题。但这可能太高了。您可以使用引用成员而不是指针来记录这一点。我自己避免引用成员,因为我几乎总是想要可复制和可赋值的类型。但是,请参阅示例:我应该在成员数据中使用指针还是引用?关于这个问题的讨论

另一个维度是另一个实体是否可以修改变量。"const"说我保证不修改在多线程代码中,我们想说的几乎是相反的。也就是"其他代码承诺在我们使用它的时候不会修改它"。(没有显式锁)但这是离题的方式…

有一个很大的技术问题可能无法解决,这使得标准化not_null成为一个问题:它不能与只移动的智能指针一起工作。

not_null最重要的用例是智能指针(对于原始指针,引用通常是足够的,但即使这样,有时引用也会不起作用)。not_null<shared_ptr<T>>是一个有用的东西,它说明了使用这种对象的API的一些重要信息。

not_null<unique_ptr<T>>不起作用。它不能工作。原因是,从唯一指针移动会使旧对象为空。这正是not_null所要防止的。因此,not_null<T>总是强制复制其包含的T。哪一个你不能用unique_ptr,因为这是该类型的全部意义。

能够说API所使用的unqiue_ptr不是null是很好的和有用的。但是你不能在not_null中这样做,这在它的实用程序中有一个漏洞。

只要只移动的智能指针不能与not_null一起工作,标准化类就会成为问题。

相关内容

  • 没有找到相关文章

最新更新