问题标签 [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.
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++ - 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++ - gsl::span 无法使用 std::regex 编译
我正在尝试使用gsl::span
将一些数据从混合二进制/ascii数据的打包结构(因此没有vector
or 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' 的声明
这是我正在尝试做的事情:
c++ - 使用 cmake 将依赖项传播到仅限标头的 ExternalProject
我正在尝试使用 CMake ( Microsoft/GSL ) 构建一个仅包含标头的库,这样我就可以使用变量GSL_INCLUDE_DIRS
和GSL_LIBRARIES
链接到目标并传播适当的依赖项。
我正在处理的项目有大量子目录,所有外部项目都构建在它们自己的子目录中,因此变量很重要。
我正在使用 CMake 3.2.3
通常(对于具有实际 .lib 或 .a 的库)我会执行以下操作:
这里的问题是仅标头库没有设置导入路径的库,所以我不能使用IMPORTED
库。如果我根本不使用库,那么我无法在 GSL 上的其他模块中设置依赖项,而无需每次都构建(即下载/解压缩) ,这是我不想做的。acustom_target
会有同样的问题,所以这是不行的。
我想我想要的是一个接口库,比如
但随后 cmake 抱怨说
3rdParty/gsl/CMakeLists.txt:33 (add_dependencies) 处的 CMake 错误:add_dependencies 无法将目标级别的依赖项添加到 INTERFACE 库目标“gsl”。
有没有办法可以使用接口库(或其他东西)来传播对外部项目的依赖?
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?
c++ - 将 gsl::span 与 range-v3 一起使用
我尝试了一个小例子来习惯 GSL 和 range-v3 库,我想知道它们如何协同工作。我有这个玩具例子
哪个有效。但是,如果我尝试将gsl::span<int>
其用作范围,则会导致错误消息。编译器告诉我这span
并不能满足视图概念。
编译器消息:
但据我了解,它应该是因为 aspan
是一个特定的视图,甚至具有begin()
和end()
迭代器(相同类型)。
- 如果他们一起工作是可组合的,或者有什么理由不兼容,那不是很酷吗?
- 我认为这是一个来自 range-v3 中强大的“概念”使用的问题。如果该语言支持某种其他类型的概念功能,它会自动解决吗?
span
如果我想在某些(非工业)软件中同时使用这两个库,我认为目前需要一些调整。我应该改变什么才能使这些协同工作?(如果这是个好主意的话)- 这也最终使我想到了“有什么课程可以完成工作
range-v3
?”的问题。从外观、适配器或此类继承是当前告诉编译器这些概念要求的唯一方法吗?
c++ - 致命错误 C1001:编译器发生内部错误
我尝试在我的 VS2013 中故意包含 gsl.h。当我尝试构建项目时,它说
c:\users\njain6\documents\visual studio 2013\projects\gcldemo\string_span.h(336):致命错误 C1001:编译器发生内部错误。
我遵循的步骤:
- 我从 Github 下载了 zip 文件。
- 将 zip 解压缩到项目文件夹中的文件夹中。
- 在项目中包含 gsl 标头。
我在这里错过了什么吗?
c++ - Ensures() - 指南支持库
我试图了解如何Ensures()
在代码中使用。如示例中所示,如果我尝试使用Ensures()
如下...
如果result
变量不等于255
,程序将崩溃并显示以下输出"terminate called without an active exception"
。我的问题是如何Ensures()
正确使用?
c++ - 什么是 C++ GSL 指南?
Stroustrup 去年发表了关于他的 GSL(Guideline Support Library)的演讲。Micosoft 在https://github.com/Microsoft/GSL有一个实现。我的印象是 GSL 应该就糟糕的编码风格提出建议,并提出改进建议。
为此,我安装了 MSFT 的 GSL 并创建了一个 C++ 文件:
并使用 Makefile 构建它:
显然,代码中存在由“new”引起的资源泄漏。
所以现在我很困惑。
- GSL 应该实际“做什么”?
- 我在哪里可以获得警告准则不合规的源代码检查器?Stroustrup 似乎暗示它实际上是作为一种工具存在的,但事实是这样吗?