在第n次将注释"// not null"
添加到原始指针后,我再次想知道not_null
模板发生了什么。
c++核心准则是在相当长一段时间之前创建的,现在已经有一些东西被纳入了标准,包括std::span
(有些像string_view
和std::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
一起工作,标准化类就会成为问题。