- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
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 forarray_view
,string_view
,unique_ptr
,shared_ptr
, and other pointer-like types.
我想象的特征对照表如下:
T&
:
nullptr
? - 是的 std::reference_wrapper<T>
:
nullptr
? - 是的 gsl::not_null<T*>
:
nullptr
? - 是的现在终于有问题了:
std::reference_wrapper
现在没用了吗?PS 我创建了标签 cpp-core-guidelines
和 guideline-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/
我正在编写一些代码,其中使用了一些 GNU GSL 函数。 出于纯粹的兴趣,我想知道这些功能是如何实现的,因此我想看看源代码。 问题是我似乎无法找到它所在的目录。 我知道我可以在“/usr/local
我需要计算 ∫ [x₁ to x₂] 1/√(1-k² sinh²(x)) dx 在我的程序中。这可以使用在复数参数中评估的第一类不完全椭圆积分来表示: -i (F(ix₂ | -k²) - F(ix
brew install gsl - 没问题 快速制作一个使用 gsl 的 Mac 应用程序,以检查它是否正常工作。 ( Handy example here. ) - 没问题 它们在/include
给定以下函数,采用:只读 float 跨度(动态或任何静态大小): template void foobar(gsl::span x); 假设我有一个 vector .将其作为参数传递是行不通的,但
C++ Core Guidelines促进实践using span . 问题在于 const 和可变范围。这是我尝试做的: auto foo(gsl::span); // 1st au
我正在尝试获取一个名为 emergent 的软件在职的。它依赖于我已经安装的 qt 和 coin。 但是当我尝试运行 emergent 时,出现以下错误: dyld: Library not load
假设我有一个成员变量std::vector在一个类中,我想使用 gsl::array_view 的组合从成员函数返回它作为不可变 View 和 gsl::cstring_view .不幸的是,以下内容
我正在尝试计算两个 vector a 和 b 之间的马氏距离。最终,我将使用它作为统计算法中的距离度量。我正在使用 gsl 来实现它们。马氏距离的公式是 sqrt((a-b)'c^-1(a-b)),其
我正在将指南支持库检查器集成到我的项目中。 Microsoft.CppCoreCheck Microsoft.Gsl 当我运行它时,我从包含的库(如标准库、glm、boost 等)中收到一堆错误。 一
我记得读过 mat4x3 比 mat3x4 使用了更多的寄存器,因为它有四列,即使它们具有相同数量的元素。我似乎无法在任何地方找到它了。新规范是否对两种类型的矩阵使用相同数量的统一寄存器? 转置是否也
我想使用 GSL 的统一随机数生成器。在他们的网站上,他们包含以下示例代码: #include #include int main (void) { const gsl_rng_t
我最近安装了 GSL,用于我的计算作业。我从预构建的库安装了它,并将其链接到 CodeBlocks,然后运行 GSL(贝塞尔函数)的测试示例以确保它有效。一切都很顺利。 然后我尝试了这里给出的线性
我现在正在与 GSL 合作。我在寻找特征值时遇到一些问题。在对称矩阵的情况下,GSL 似乎没有正确给出特征值。我给出了某些对称矩阵的输入,这些矩阵的特征值应该为 0,但是,GSL 函数返回非零特征值来
构建后: $ gcc generator.c -lm -lgsl -lgslcblas -lm 代码: #include #include gsl_rng * r; /* global gene
我正在使用 GSL 进行大量三次样条插值。假设我有三个自变量 a、b 和 c,所有变量都在相同的物理数据点上制表(可能是同一组位置)以米、英尺和英里为单位),以及两个因变量 y 和 z,在相同点处制表
我目前正在尝试在另一个自己编写的库(Quaternion.c)中使用我之前编写的库(matrix.c),方法是使用使用“matrix.h”的标准方法通过头文件调用它”包含“matrix.c”文件中的函
我正在尝试更新旧代码,该代码使用的是具有已弃用函数的 GSL 版本,但我在寻找如何使用新版本的归一化勒让德多项式函数时遇到了麻烦。这是总结问题的片段: #include #include #inc
我正在使用 GSL 示例页面上的代码来尝试求解一个包含四个微分方程的系统。我一直在努力将五个参数传递给 ODE 系统,并且遇到了一个最终的(我希望!)编译时错误。下面是一个片段,给我错误 114:57
我已经在 Kubuntu 14.04 中安装了最新版本的 GSL (1.16)。我使用库附带的文件 INSTALL(逐步)进行安装。我配置了 eclipse-cdt 环境以供使用。它工作,我认为,因为
我有一个非常简单的问题——我只想在 C 语言的 gsl 中将两个具有复杂条目的矩阵相乘。例如,我想定义一个函数 gsl_matrix_complex *multiply( gsl_matrix_com
我是一名优秀的程序员,十分优秀!