Bru*_*ams 8 c++ cpp-core-guidelines
"// not null"在第 N 次将注释添加到原始指针后,我再次想知道not_null模板发生了什么。
C++ 核心指南是在很久以前创建的,并且一些内容已经纳入标准,例如std::span(有些内容类似于string_view核心std::array指南本身并且起源于核心指南本身,但有时会被混淆)。鉴于其相对简单,为什么 not_null (或类似的东西)还没有将其纳入标准?
我定期扫描 ISO 邮件(但可能不彻底),而且我什至不知道有这样的建议。
可能回答我自己的问题。我不记得遇到过任何可以防止我编写的代码出现错误的情况,因为我们尽量不以这种方式编写代码。
这些指南本身很受欢迎,例如 clang-tidy 和声纳。支持库似乎不太受欢迎。
例如,boost 从一开始就作为 Linux 上的软件包提供。我不知道 GSL 有任何实现。不过,我认为它与 Windows 上的 Visual C++ 捆绑在一起。
既然评论里有人问了。
我自己会用它来记录意图。像这样的构造not_null<>可能具有注释所没有的语义价值。尽管我可以看到它的位置,但执行它是次要的。这最好以零开销来完成(也许仅在有限数量的情况下在编译时)。
我主要考虑的是原始指针成员变量的情况。我忘记了将指针传递给函数的情况,对于该函数,我总是使用引用来表示非空,也表示“我不取得所有权”。
同样(对于班级成员)我们也可以记录所有权owned<> not_owned<>。
我想还有是否允许更改关联对象。但这可能太高了。您可以使用引用成员而不是指针来记录这一点。我自己避免引用成员,因为我几乎总是想要可复制和可分配的类型。但是,请参见示例:我应该在成员数据中选择指针还是引用?对此进行一些讨论。
另一个维度是另一个实体是否可以修改变量。“const”表示我保证不修改它。在多线程代码中,我们想说的几乎相反。那就是“其他代码承诺在我们使用它时不会修改它”(没有显式锁定),但这远离主题......
Nic*_*las 20
有一个可能无法解决的重大技术问题,这使得标准化成为not_null一个问题:它无法与仅移动智能指针一起使用。
最重要的用例not_null是智能指针(对于原始指针来说,引用通常就足够了,但即使如此,有时引用也不起作用)。not_null<shared_ptr<T>>是一个有用的东西,它说明了有关使用此类对象的 API 的一些重要信息。
但not_null<unique_ptr<T>>不起作用。这是行不通的。原因是从唯一指针移动会使旧对象为空。这正是not_null预期要防止的。因此,not_null<T>始终在其包含的T. 这...你不能用 a 来做unique_ptr,因为这就是该类型的全部要点。
能够说unqiue_ptrAPI 所使用的内容不为 null 是很好且有用的。但实际上你不能用 来做到这一点not_null,这在它的实用性上造成了漏洞。
只要仅移动智能指针无法与 一起使用not_null,标准化类就会出现问题。
| 归档时间: |
|
| 查看次数: |
2440 次 |
| 最近记录: |