问题标签 [cpp-core-guidelines]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - gsl::not_null与 std::reference_wrapper 对比与 T&
最近提出了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
为此,我希望是正确的。
c++ - 地图、集合等的 array_view 替代方案
假设我有一些类层次结构,其中有几个virtual
函数返回容器引用:
目前,只能在类的任何子类中实际返回 a vector
、set
或。但是,对于这一部分,我可以使用例如 a来软化这个限制:map
Interface
vector
gsl::array_view
所以问题是,是否有用于array_view
其他容器类型的替代方案?基本上,我想要的是一个轻量级对象,我可以从一个函数返回,该函数将充当某个容器的不可变视图,而无需指定特定的容器类型。std::set
将 a 推到类似 an的位置对我来说甚至是有意义的array_view
,但支持的操作较少(例如,没有随机访问)。map
显然是不同的野兽,需要不同的view
支持关联查找,但即使对于 amap
我认为有能力说array_view<const std::pair<const int, int>>
. 我要求太多了吗?或者也许有合理的方法来实现这一点?或者甚至可能存在这种“视图”的现有实现?
PS:继承不是先决条件-我只是认为这是提出问题的最简单方法。
c++ - gsl::array_view> 来自 std::vector
假设我std::vector<std::string>
在一个类中有一个成员变量,并且我想使用gsl::array_view
和的组合从成员函数将其作为不可变视图返回gsl::cstring_view
。不幸的是,以下内容无法编译:
原因是没有可以从中创建cstring_view
的容器。array_view
所以我的问题是:有没有一种方法可以在不显式添加类似 type 的成员的情况下使用这样的构造std::vector<gsl::cstring_view<>>
,这显然是不可取的?
编辑
在我看来,这种“转变”的观点可能更普遍。考虑拥有一个vector
拥有指针,例如std::vector<std::shared_ptr<T>>
,我想将其作为一个array_view
原始指针公开给类的用户:gsl::array_view<const T*>
而不公开我的实现定义的存储方法。想法?
c++ - 提升::any_range> 在发布模式下崩溃
我观察到以下代码的一个相当奇怪的行为:
这里的想法是隔离一个字符串序列的实际表示,该字符串序列作为参数由andf
后面的函数接收(注意,提交更改为几个小时前已在 GSL 中进行)。any_range
gsl::string_span
string_view
string_span
我的原始代码没有const T
asReference
模板参数any_range
(它很简单T
),并且在执行期间崩溃了。但是,这仅在发布模式下发生,在 Debug 或 RelWithDebInfo(由 CMake 生成)中运行良好。我使用了 VS2013/2015 x64。此外,尝试调试完整的 Release 版本,将调试输出添加到转换 lambda 消除了崩溃(我的猜测是它阻止了一些内联)。我最终的工作解决方案是指定const T
为Reference
.
但是,我仍然想知道为什么崩溃首先发生?它是VS编译器错误吗?当前实现中的错误string_span
?还是我只是在滥用boost::any_range
?
编辑
刚刚使用 clang 3.7.0 构建了版本并且行为相似(在调试中工作正常并且不会崩溃,但在没有const T
with 的情况下输出垃圾-O2
)。所以它似乎不是编译器问题。
c++ - 为什么我不能用大括号括起来的初始化列表构造一个 gsl::span
根据C++ Core Guidelines,我应该使用 gsl::span 来传递半开序列。
我认为这意味着不要编写如下函数:
我应该更喜欢:
这样做的好处是它不假设调用者将他们的数据放在 a 中vector
,或者强制他们构造一个临时的vector
. 例如,他们可以通过一个std::array
。
但是一个常见的用例是传递一个大括号括起来的初始化列表:
这适用于采用 a 的函数,std::vector
但对于采用 a 的函数,gsl::span
我收到错误消息:
错误 C2664:“void func(gsl::span)”:无法将参数 1 从“initializer-list”转换为“gsl::span”
它看起来gsl::span
有一个模板化的构造函数,旨在接受任何容器。
这只是 Microsoft GSL 实施中缺少的东西,还是有充分的理由阻止这种做法?
c++ - 从类中返回内存的建议
我有一个应该保留像素数据的类(浮动的位置,浮动的颜色)。我正在尝试在数据成员中使用 C++ 样式(数据保存在std::array<float, N>
而不是普通的 C 数组中)。该类还有其他 getter、setter 和函数,旨在成为填充这些字段的“助手”。
现在我需要创建一个 OpenGL 顶点数据缓冲区,我应该在其中写出
按照这个顺序。我想知道我该怎么做..我试着做
但是这种方法有两个问题:
- 我需要相信调用者已分配内存来存储 10 个浮点数
- 没有 C++11+ 签名,我只是得到一个浮点指针
我不能只返回 a std::unique_ptr
,因为我需要一个连续的内存区域 ( buffer
) 来存储元素,但我还需要区分不同的元素(这也会使代码更具可读性)。
最好返回一个智能指针或类似的东西,我可以轻松地将其内存“连接”到其他元素,这样我就可以安全地将这些东西传递给 OpenGL。
c++ - 如何在虚幻引擎项目中使用 C++ Core Checker?
以下是如何使用 C++ Core Checker 的说明:C++ Core Guidelines Checkers available for VS 2015 Update 1。
我成功安装了 NuGet 包,但无法使用/启用它。UE生成的项目的Property Pages中没有与静态分析相关的选项。
尝试分析 → 运行代码分析也无济于事。
尝试分析 → 配置代码分析会导致消息“当前没有加载可分析的项目”。
为什么这些项目无法分析?有可能改变吗?
c++ - gsl 库中的 span 和 array_view 有什么区别?
在最近的几次会议演讲中,我听到 Bjarne Stroustrup 和其他人提到了 C++ 的新编码指南以及一些支持它们的类型。
具体来说,我记得这个例子,span<T>
而不是(T* p, int n)
作为函数的参数(大约在 32:00 进入谈话时);但我也记得使用的建议array_view<T>
。它们是两种选择但相同的概念吗?还是我混淆了事情,它们实际上并没有那么相关?
我似乎找不到任何关于它们应该是什么的权威定义。
c++ - 是否有合法的方式从 gsl::not_null 移动?
指南支持库介绍了谁的目的是在类似not_null<T>
指针的类型上强制执行不变量,特别是在智能指针上。但是,这是一个不起作用的已知问题。not_null<unique_ptr<T>>
据我所知,原因是它unique_ptr<T>
不是可复制构造的,并且not_null<T>
没有从其 T 移动的构造函数。not_null<T>
也不是默认可构造的,因为它会破坏它的不变性。即使我们可以构造not_null<unique_ptr<T>>
,也不可能有意义地到达unique_ptr
内部,因为我们无法复制unique_ptr
和移动它会留下not_null<T>
一个空指针。它看起来像一个完美的陷阱。
我认为我们可以合法地从not_null<T>
特定上下文中的对象移出:就在它超出范围之前。换句话说,离开它应该是销毁前的最后一次访问。这样,具有破坏不变性的对象将不会被程序的其余部分观察到。(仅可观察到not_null
' 自己的代码。)
在以下示例中,假设我们可以从not_null<T>
.
我的假设是否正确,即
not_null<unique_ptr<int>>
从 f() 返回的状态在从它移动后不会泄漏(仅用于示例)?我的假设是否正确,即
not_null<unique_ptr<int>>
传递给 g() 的状态在从它移动后不会泄漏(仅用于示例)?是否可以在禁止 C++14/17 中常见的移动情况的同时允许这种特殊的移动?
c++ - 是否有可以与 GCC 4.9.x 一起使用的 GSL 实现?
微软的(核心)指南支持库实现据说支持 GCC 5.1 - 但没有指定对其他版本的支持。更高的版本似乎没问题(无论如何,我的 Debian Stretch 上是 5.3.1) - 但是使用 GCC 4.9.3 构建测试失败。
- 其他人实施了 GSL 吗?
- 无论如何,我可以使用 MS GSL 吗?
- 如果没有,我可以使用它的一些安全子集吗?(可能不会,我知道)
- 如果不是,那么只有拥有较新编译器的人才能拥有指南支持库,这不是一个问题吗?即使他们的旧编译器支持 C++11 甚至 C++14?