最近提出了C++ 核心指南gsl::not_null
(恭喜!),我担心类型。如I.12 中所述:将不能为空的指针声明为not_null
:
帮助避免取消引用 nullptr 错误。通过避免对 nullptr 进行冗余检查来提高性能。
...
通过在源代码中说明意图,实现者和工具可以提供更好的诊断,例如通过静态分析发现某些类别的错误,并执行优化,例如删除分支和空测试。
意图很明确。但是,我们已经为此提供了语言功能。不能为空的指针称为引用。虽然引用一旦创建就不能被重新绑定,这个问题通过std::reference_wrapper
.
gsl::not_null
和我之间的主要区别在于std::reference_wrapper
后者只能用于代替指针,而前者适用于任何可赋值的nullptr
对象(引自 F.17:使用 not_null 表示“null”不是有效值):
not_null
不仅适用于内置指针。它适用于array_view
、string_view
、unique_ptr
、shared_ptr
和其他类似指针的类型。
我想象的功能比较表如下:
T&
:
- 不能存储
nullptr
?-是的 - 可重新绑定?-没有
- 可以用来代替指针以外的东西吗?-没有
std::reference_wrapper<T>
:
- 不能存储
nullptr
?-是的 - 可重新绑定?-是的
- 可以用来代替指针以外的东西吗?-没有
gsl::not_null<T*>
:
- 不能存储
nullptr
?-是的 - 可重新绑定?-是的
- 可以用来代替指针以外的东西吗?-是的
现在这里是问题,最后:
- 我对这些概念之间差异的理解是否正确?
- 这是否意味着
std::reference_wrapper
现在没有用了?
PS我创建了标签cpp-core-guidelines
,guideline-support-library
为此,我希望是正确的。