问题标签 [guideline-support-library]

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 投票
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 回答
146 浏览

c++ - gsl::span 无法使用 std::regex 编译

我正在尝试使用gsl::span将一些数据从混合二进制/ascii数据的打包结构(因此没有vectoror string)传递给一个函数,我想在其中使用正则表达式对其进行操作,但出现以下错误:

错误 C2784:'bool std::regex_match(_BidIt,_BidIt,std::match_results<_BidIt,_Alloc> &,const std::basic_regex<_Elem,_RxTraits> &,std::regex_constants::match_flag_type)':无法推断'std::match_results>,_Alloc> &' 的模板参数来自 'std::cmatch'

见 'std::regex_match' 的声明

这是我正在尝试做的事情:

0 投票
1 回答
2129 浏览

c++ - 使用 cmake 将依赖项传播到仅限标头的 ExternalProject

我正在尝试使用 CMake ( Microsoft/GSL ) 构建一个仅包含标头的库,这样我就可以使用变量GSL_INCLUDE_DIRSGSL_LIBRARIES链接到目标并传播适当的依赖项。

我正在处理的项目有大量子目录,所有外部项目都构建在它们自己的子目录中,因此变量很重要。

我正在使用 CMake 3.2.3

通常(对于具有实际 .lib 或 .a 的库)我会执行以下操作:

这里的问题是仅标头库没有设置导入路径的库,所以我不能使用IMPORTED库。如果我根本不使用库,那么我无法在 GSL 上的其他模块中设置依赖项,而无需每次都构建(即下载/解压缩) ,这是我不想做的。acustom_target会有同样的问题,所以这是不行的。

我想我想要的是一个接口库,比如

但随后 cmake 抱怨说

3rdParty/gsl/CMakeLists.txt:33 (add_dependencies) 处的 CMake 错误:add_dependencies 无法将目标级别的依赖项添加到 INTERFACE 库目标“gsl”。

有没有办法可以使用接口库(或其他东西)来传播对外部项目的依赖?

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?
0 投票
1 回答
1511 浏览

c++ - 将 gsl::span 与 range-v3 一起使用

我尝试了一个小例子来习惯 GSL 和 range-v3 库,我想知道它们如何协同工作。我有这个玩具例子

哪个有效。但是,如果我尝试将gsl::span<int>其用作范围,则会导致错误消息。编译器告诉我这span并不能满足视图概念。

编译器消息:

但据我了解,它应该是因为 aspan 一个特定的视图,甚至具有begin()end()迭代器(相同类型)。

  • 如果他们一起工作是可组合的,或者有什么理由不兼容,那不是很酷吗?
  • 我认为这是一个来自 range-v3 中强大的“概念”使用的问题。如果该语言支持某种其他类型的概念功能,它会自动解决吗?
  • span如果我想在某些(非工业)软件中同时使用这两个库,我认为目前需要一些调整。我应该改变什么才能使这些协同工作?(如果这是个好主意的话)
  • 这也最终使我想到了“有什么课程可以完成工作range-v3?”的问题。从外观、适配器或此类继承是当前告诉编译器这些概念要求的唯一方法吗?
0 投票
1 回答
1011 浏览

c++ - 致命错误 C1001:编译器发生内部错误

我尝试在我的 VS2013 中故意包含 gsl.h。当我尝试构建项目时,它说

c:\users\njain6\documents\visual studio 2013\projects\gcldemo\string_span.h(336):致命错误 C1001:编译器发生内部错误。

我遵循的步骤:

  1. 我从 Github 下载了 zip 文件。
  2. 将 zip 解压缩到项目文件夹中的文件夹中。
  3. 在项目中包含 gsl 标头。

我在这里错过了什么吗?

0 投票
1 回答
4593 浏览

c++ - Ensures() - 指南支持库

我试图了解如何Ensures()在代码中使用。如示例中所示,如果我尝试使用Ensures()如下...

如果result变量不等于255,程序将崩溃并显示以下输出"terminate called without an active exception"。我的问题是如何Ensures()正确使用?

0 投票
2 回答
23966 浏览

c++ - 什么是 C++ GSL 指南?

Stroustrup 去年发表了关于他的 GSL(Guideline Support Library)的演讲。Micosoft 在https://github.com/Microsoft/GSL有一个实现。我的印象是 GSL 应该就糟糕的编码风格提出建议,并提出改进建议。

为此,我安装了 MSFT 的 GSL 并创建了一个 C++ 文件:

并使用 Makefile 构建它:

显然,代码中存在由“new”引起的资源泄漏。

所以现在我很困惑。

  • GSL 应该实际“做什么”?
  • 我在哪里可以获得警告准则不合规的源代码检查器?Stroustrup 似乎暗示它实际上是作为一种工具存在的,但事实是这样吗?