c++17相关内容

如何在需要旧式无符号字符的地方使用新的 std::byte 类型?

std::byte 是 C++17 中的一种新类型,它被定义为 enum class byte : unsigned char.这使得在没有适当转换的情况下无法使用它.所以,我为这种类型的向量做了一个别名来表示一个字节数组: using Bytes = std::vector; 但是,不能在旧式中使用它:接受它作为参数的函数会失败,因为这种类型不能轻易转换成旧的 std::vector输入, ..
发布时间:2021-12-21 13:36:33 C/C++开发

std::launder 的目的是什么?

P0137 介绍功能模板 std::launder 并在有关联合、生命周期和指针的部分对标准进行了很多很多更改. 这篇论文要解决的问题是什么?我必须注意语言的哪些变化?我们洗钱在做什么? 解决方案 std::launder 的命名恰如其分,但前提是您知道它的用途.它执行内存清洗. 考虑论文中的例子: struct X { const int n;};联合 U { X x;浮动 ..
发布时间:2021-12-21 09:48:45 C/C++开发

实验::文件系统链接器错误

我尝试在 gcc 6.0 中实际使用新的 c++1z 特性. 如果我试试这个小例子: #include #include 命名空间 fs = std::experimental::filesystem;int main(){fs::path p1 = "/home/pete/checkit";std::cout ..
发布时间:2021-12-18 22:34:21 C/C++开发

如何在 VSCode C++ 扩展中启用 C++17 支持

我一直在 std::string_view 上出现错误曲线,但我能够构建得很好.有没有办法告诉智能感知或 C++ linter 使用 C++17? 我得到的具体错误是: 命名空间“std"没有成员“string_view" 解决方案 现在这变得容易多了.在您的 vs code 扩展设置中搜索 cppstandard,然后从下拉列表中选择您希望扩展使用的 C++ 版本. 为了确保您 ..
发布时间:2021-12-17 12:13:49 C/C++开发

我可以将 C++17 无捕获 lambda constexpr 转换运算符的结果用作函数指针模板非类型参数吗?

在回答我该怎么做编写一个看起来像方法的 lambda 表达式?,我试图通过利用以下事实将无捕获的 lambda 转换为成员函数指针,因为自 C++17 起,无捕获的 lambda 具有 constexpr 将运算符转换为其函数指针类型. 所以我想出了一个问题: template结构 A{};int main(){A([]{})>{};//1co ..
发布时间:2021-12-13 19:17:15 C/C++开发

检查是否在可变参数模板参数包中传递了类型

我在某处听说,使用新的 C++1z 语法,检查类型是否在可变参数模板参数包中传递非常容易 - 显然,您可以使用接近一行的代码来执行此操作.这是真的?这些相关功能是什么?(我尝试查看折叠表达式,但我不知道如何在该问题中使用它们...) 以下是我在 C++11 中解决问题的方法以供参考: #include 模板结构包含;模板结构体包含{静态 constexpr bool 值 = 假;};tem ..
发布时间:2021-12-13 19:14:27 C/C++开发

C++17类模板部分推导

我对模板的理解类模板的参数推导 提议是在推导上下文中将模板函数和模板类的行为同质化.但我觉得我误解了一些东西. 如果我们有这个模板对象: template 结构测试{静态 constexpr 自动大小 = S;使用 type_t = T;测试(type_t(&input)[size]):数据(输入){}type_t (&data)[size]{};}; 我倾向于使用辅助函数作为语法糖来创 ..
发布时间:2021-12-13 18:36:21 C/C++开发

什么是模板推导指南,我们应该在什么时候使用它们?

C++17 标准引入了“模板推导指南".我认为它们与此版本标准中引入的构造函数的新模板参数推导有关,但我还没有看到关于它们是什么以及它们的用途的简单的、常见问题解答式的解释. 什么是 C++17 中的模板推导指南? 我们为什么(以及何时)需要它们? 我如何声明它们? 解决方案 模板推导指南是与模板类相关联的模式,它告诉编译器如何将一组构造函数参数(及其类型)转换为类的模板 ..
发布时间:2021-12-13 18:22:52 C/C++开发

自 C++17 以来,具有正确地址和类型的指针是否仍然始终是有效指针?

(参考 这个问题和答案.) 在C++17标准之前,中包含了下面这句话[basic.compound]/3: 如果类型 T 的对象位于地址 A,则称其值为地址 A 的类型为 cv T* 的指针指向该对象,无论该值是如何获得的. 但从 C++17 开始,这句话已经删除. 例如我相信这句话定义了这个示例代码,并且因为 C++17 这是未定义的行为: alignas(int) ..
发布时间:2021-12-13 13:03:40 C/C++开发

C++17 std::optional 错误:'auto' 之前的预期主表达式

我正在试验 C++17 特性 std::optional 可选返回类型为std::optional>.我叫sum_pair 函数在 print_answer 函数中,想要一个可选的打印. 在 print_answer 函数中,我想检查所需的对是否包含要显示的内容.就像在下面给出的例子中一样:可选返回工厂函数可用作 while 和 if 的条件 以下是代码:这里有错误 #incl ..
发布时间:2021-12-12 14:06:22 C/C++开发

“if constexpr()"之间的区别与“if()"

if constexpr() 和 if() 有什么区别? 我可以在何时何地同时使用它们? 解决方案 唯一的区别是 if constexpr 在编译时被评估,而 if 不是.这意味着分支可以在编译时被拒绝,因此永远不会被编译. 假设你有一个函数,length,它返回一个数字的长度,或者一个具有 .length() 函数的类型的长度.你不能在一个函数中做到,编译器会抱怨: tem ..
发布时间:2021-12-12 13:11:21 C/C++开发

boost::combine,基于范围的和结构化绑定

有没有办法让 boost::combine 与结构化绑定和基于范围的 for 一起工作(这样结构绑定中的标识符实际上指向容器的元素而不是嵌套的任何 boost::combine 在幕后使用)?以下(live example)无法编译: #include #include int main(){std::vector一{1,2,3};std::vectorb{2,3,4};for (auto [f ..
发布时间:2021-12-11 12:52:11 C/C++开发

如何在 Visual Studio 中启用 C++17 编译?

我想使用 C++17 特性. 如何在 Microsoft Visual Studio 中将编译从 C++14 切换到 C++17? 或者它在 VS 的发布版本中不可用? 解决方案 现在有一个下拉菜单(至少从 VS 2017.3.5 开始),您可以在其中专门选择 C++17.可用的选项是(在项目 > 属性 > C/C++ > 语言 > C++ 语言标准下) ISO C++1 ..
发布时间:2021-12-07 13:45:38 C/C++开发

理解 std::hardware_corruption_interference_size 和 std::hardware_constructive_interference_size

C++17 添加了 std::hardware_corruption_interference_size 和 std::hardware_constructive_interference_size.首先,我认为这只是一种获取 L1 缓存行大小的可移植方式,但这过于简单化了. 问题: 这些常量与 L1 缓存行大小有什么关系? 是否有一个很好的例子来展示他们的用例? 两者都定义了st ..
发布时间:2021-12-06 11:59:24 C/C++开发