问题标签 [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.

0 投票
2 回答
14992 浏览

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_viewstring_viewunique_ptrshared_ptr和其他类似指针的类型。

我想象的功能比较表如下:

T&

  • 不能存储nullptr?-是的
  • 可重新绑定?-没有
  • 可以用来代替指针以外的东西吗?-没有

std::reference_wrapper<T>

  • 不能存储nullptr?-是的
  • 可重新绑定?-是的
  • 可以用来代替指针以外的东西吗?-没有

gsl::not_null<T*>

  • 不能存储nullptr?-是的
  • 可重新绑定?-是的
  • 可以用来代替指针以外的东西吗?-是的

现在这里是问题,最后:

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

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

0 投票
2 回答
612 浏览

c++ - 地图、集合等的 array_view 替代方案

假设我有一些类层次结构,其中有几个virtual函数返回容器引用:

目前,只能在类的任何子类中实际返回 a vectorset或。但是,对于这一部分,我可以使用例如 a来软化这个限制:mapInterfacevectorgsl::array_view

所以问题是,是否有用于array_view其他容器类型的替代方案?基本上,我想要的是一个轻量级对象,我可以从一个函数返回,该函数将充当某个容器的不可变视图,而无需指定特定的容器类型。std::set将 a 推到类似 an的位置对我来说甚至是有意义的array_view,但支持的操作较少(例如,没有随机访问)。map显然是不同的野兽,需要不同的view支持关联查找,但即使对于 amap我认为有能力说array_view<const std::pair<const int, int>>. 我要求太多了吗?或者也许有合理的方法来实现这一点?或者甚至可能存在这种“视图”的现有实现?

PS:继承不是先决条件-我只是认为这是提出问题的最简单方法。

0 投票
1 回答
1454 浏览

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*>而不公开我的实现定义的存储方法。想法?

0 投票
3 回答
452 浏览

c++ - 提升::any_range> 在发布模式下崩溃

我观察到以下代码的一个相当奇怪的行为:

这里的想法是隔离一个字符串序列的实际表示,该字符串序列作为参数由andf后面的函数接收(注意,提交更改为几个小时前已在 GSL 中进行)。any_rangegsl::string_spanstring_viewstring_span

我的原始代码没有const TasReference模板参数any_range(它很简单T),并且在执行期间崩溃了。但是,这仅在发布模式下发生,在 Debug 或 RelWithDebInfo(由 CMake 生成)中运行良好。我使用了 VS2013/2015 x64。此外,尝试调试完整的 Release 版本,将调试输出添加到转换 lambda 消除了崩溃(我的猜测是它阻止了一些内联)。我最终的工作解决方案是指定const TReference.

但是,我仍然想知道为什么崩溃首先发生?它是VS编译器错误吗?当前实现中的错误string_span?还是我只是在滥用boost::any_range

编辑

刚刚使用 clang 3.7.0 构建了版本并且行为相似(在调试中工作正常并且不会崩溃,但在没有const Twith 的情况下输出垃圾-O2)。所以它似乎不是编译器问题。

0 投票
3 回答
5146 浏览

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 实施中缺少的东西,还是有充分的理由阻止这种做法?

0 投票
1 回答
121 浏览

c++ - 从类中返回内存的建议

我有一个应该保留像素数据的类(浮动的位置,浮动的颜色)。我正在尝试在数据成员中使用 C++ 样式(数据保存在std::array<float, N>而不是普通的 C 数组中)。该类还有其他 getter、setter 和函数,旨在成为填充这些字段的“助手”。

现在我需要创建一个 OpenGL 顶点数据缓冲区,我应该在其中写出

按照这个顺序。我想知道我该怎么做..我试着做

但是这种方法有两个问题:

  1. 我需要相信调用者已分配内存来存储 10 个浮点数
  2. 没有 C++11+ 签名,我只是得到一个浮点指针

我不能只返回 a std::unique_ptr,因为我需要一个连续的内存区域 ( buffer) 来存储元素,但我还需要区分不同的元素(这也会使代码更具可读性)。

最好返回一个智能指针或类似的东西,我可以轻松地将其内存“连接”到其他元素,这样我就可以安全地将这些东西传递给 OpenGL。

0 投票
1 回答
696 浏览

c++ - 如何在虚幻引擎项目中使用 C++ Core Checker?

以下是如何使用 C++ Core Checker 的说明:C++ Core Guidelines Checkers available for VS 2015 Update 1。

我成功安装了 NuGet 包,但无法使用/启用它。UE生成的项目的Property Pages中没有与静态分析相关的选项。

尝试分析 → 运行代码分析也无济于事。

尝试分析 → 配置代码分析会导致消息“当前没有加载可分析的项目”。

为什么这些项目无法分析?有可能改变吗?

0 投票
3 回答
29879 浏览

c++ - gsl 库中的 span 和 array_view 有什么区别?

在最近的几次会议演讲中,我听到 Bjarne Stroustrup 和其他人提到了 C++ 的新编码指南以及一些支持它们的类型。

具体来说,我记得这个例子,span<T>而不是(T* p, int n)作为函数的参数(大约在 32:00 进入谈话时);但我也记得使用的建议array_view<T>。它们是两种选择但相同的概念吗?还是我混淆了事情,它们实际上并没有那么相关?

我似乎找不到任何关于它们应该是什么的权威定义。

0 投票
1 回答
669 浏览

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>.

  1. 我的假设是否正确,即not_null<unique_ptr<int>>从 f() 返回的状态在从它移动后不会泄漏(仅用于示例)?

  2. 我的假设是否正确,即not_null<unique_ptr<int>>传递给 g() 的状态在从它移动后不会泄漏(仅用于示例)?

  3. 是否可以在禁止 C++14/17 中常见的移动情况的同时允许这种特殊的移动?

0 投票
1 回答
1358 浏览

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?