gpt4 book ai didi

c++ - gsl::not_null 与 std::reference_wrapper 与 T&

转载 作者:IT老高 更新时间:2023-10-28 14:00:30 43 4
gpt4 key购买 nike

C++ Core Guidelines最近提出了(恭喜!),我很担心gsl::not_null类型。如 I.12: Declare a pointer that must not be null as not_null 中所述:

To help avoid dereferencing nullptr errors. To improve performance by avoiding redundant checks for nullptr.

...

By stating the intent in source, implementers and tools can provide better diagnostics, such as finding some classes of errors through static analysis, and perform optimizations, such as removing branches and null tests.

意图很明确。但是,我们已经为此提供了语言功能。不能为空的指针称为引用。虽然引用一旦创建就不能被重新绑定(bind),这个问题由 std::reference_wrapper 解决。 .

gsl::not_null 之间的主要区别和 std::reference_wrapper我看到后者只能用来代替指针,而前者适用于任何东西nullptr -assignable (引自 F.17: Use a not_null to indicate that "null" is not a valid value ):

not_null is not just for built-in pointers. It works for array_view, string_view, unique_ptr, shared_ptr, and other pointer-like types.

我想象的特征对照表如下:

T& :

  • 无法存储 nullptr ? - 是的
  • 可重新绑定(bind)? -
  • 可以用来代替指针以外的东西吗? -

std::reference_wrapper<T> :

  • 无法存储 nullptr ? - 是的
  • 可重新绑定(bind)? - 是的
  • 可以用来代替指针以外的东西吗? -

gsl::not_null<T*> :

  • 无法存储 nullptr ? - 是的
  • 可重新绑定(bind)? - 是的
  • 可以用来代替指针以外的东西吗? - 是的

现在终于有问题了:

  1. 我对这些概念之间差异的理解是否正确?
  2. 这是否意味着 std::reference_wrapper现在没用了吗?

PS 我创建了标签 cpp-core-guidelinesguideline-support-library为此,我希望正确。

最佳答案

引用是 not 不能为空的指针。引用在语义上与指针非常不同。

引用具有赋值和比较语义;即涉及引用的赋值或比较操作读取和写入引用的。指针具有(违反直觉的)reference 赋值和比较语义;也就是说,涉及指针的赋值或比较操作读取和写入 reference 本身(即被引用对象的地址)。

正如您所说,引用不能被重新绑定(bind)(由于它们的赋值语义),但是 reference_wrapper<T>类模板可以被反弹,因为它有reference赋值语义。这是因为 reference_wrapper<T>被设计为与 STL 容器和算法一起使用,如果它的复制赋值运算符没有与它的复制构造函数做同样的事情,它的行为就不会正确。但是,reference_wrapper<T>仍然具有值 comparison 语义,就像引用一样,因此在与 STL 容器和算法一起使用时,它的行为与指针非常不同。例如,set<T*>可以包含指向具有相同值的不同对象的指针,而 set<reference_wrapper<T>>只能包含对具有给定值的一个对象的引用。

not_null<T*>类模板具有引用赋值比较语义,就像一个指针;它是一种类似指针的类型。这意味着当与 STL 容器和算法一起使用时,它的行为类似于指针。它不能为空。

所以,您的评估是正确的,只是您忘记了比较语义。不,reference_wrapper<T>不会被任何类型的指针式类型淘汰,因为它具有类似引用的值比较语义。

关于c++ - gsl::not_null<T*> 与 std::reference_wrapper<T> 与 T&,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33306553/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com