问题标签 [c++17]

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

c++ - 你如何在 C++ 中实现协程

我怀疑它可以便携地完成,但有什么解决方案吗?我认为可以通过创建一个备用堆栈并在函数入口处重置 SP、BP 和 IP,并让产量保存 IP 并恢复 SP+BP 来完成。析构函数和异常安全似乎很棘手,但可以解决。

已经完成了吗?这是不可能的吗?

0 投票
8 回答
9548 浏览

c++ - 为什么没有将 yield 添加到 C++0x 中?

编辑,在我问这个问题 11 年后:我觉得问这个问题是正确的!C++20 终于做了足够接近的事情

原始问题如下。

--

我一直在我的许多 Python 程序中使用 yield,它确实在许多情况下清除了代码。我写了一篇关于它的博客,它是我网站的热门页面之一。

C#还提供yield——它是通过调用方的状态保持来实现的,通过一个自动生成的类来保持状态、函数的局部变量等。

我目前正在阅读有关 C++0x 及其添加的内容;在阅读 C++0x 中 lambdas 的实现时,我发现它也是通过自动生成的类完成的,配备了 operator() 存储 lambda 代码。我脑海中自然形成了一个问题:他们是为 lambdas 做的,为什么他们不考虑支持“收益”呢?

当然,他们可以看到协同程序的价值......所以我只能猜测他们认为基于宏的实现(例如Simon Tatham 的)是一个足够的替代品。然而,它们不是,有很多原因:被调用者保持状态、不可重入、基于宏(仅此一点就足够了)等。

编辑: yield不依赖于垃圾收集、线程或纤维。你可以阅读 Simon 的文章看到我说的是编译器做一个简单的转换,比如:

进入:

垃圾收集?不,线程?不,纤维?不,简单的转变?可以说,是的。

0 投票
6 回答
175668 浏览

c++ - 什么是聚合和 POD,它们如何/为什么特别?

常见问题解答是关于聚合和 POD 的,涵盖以下材料:

  • 什么是聚合
  • 什么是POD(普通旧数据)?
  • 它们有什么关系?
  • 它们如何以及为什么特别?
  • C++11 有什么变化?
0 投票
3 回答
55818 浏览

c++ - 如何在 C++ 中创建目录

我刚刚找到了一小段代码,它可以让我在不使用 system() 的情况下使用 windows API 创建一个目录。唯一的问题是我无法在子目录中创建目录。例如

在 C 中创建一个名为 random 的文件夹。

但如果我这样做

它在名为 Usersmorons 的 C che 文件夹中创建,而不是在 Users 下创建文件夹 morons。有什么建议吗?

0 投票
4 回答
20320 浏览

c++ - 使用强类型枚举的模板参数推导

如果我有一个普通(弱)枚举,我可以将其枚举值用作非类型模板参数,如下所示:

并将其称为:magic<Cat>(t)

据我所知,如果我有一个强类型枚举并且不想对枚举类型进行硬编码,我最终会得到:

现在我必须写: magic<Animal, Animal::Cat>(t),这似乎是多余的。

有什么办法可以避免同时输入枚举类和值,短

0 投票
2 回答
418 浏览

c++ - 概念转换的等价物是什么?

考虑 aclass A满足两个概念ConceptAConceptB。让一个函数foo为两个概念重载:

注意:此示例使用作为N3701的一部分提出的“简洁表示法”语法,§5

是否存在concept_cast允许用户选择重载的东西?

例如:假设 ConceptA说 T 必须有一个成员函数bar() ConceptB说 T 必须有一个成员函数baz() 并且class A同时具有bar()baz()成员函数

它显然是模棱两可的,但是有没有办法像我们static_cast对正常重载一样明确选择?

更新:接受的答案超过 2 年。c++17有什么更新吗?

0 投票
2 回答
784 浏览

c++ - 即使 XZY 具有非复制约束,构造助手 make_XYZ 也允许 RVO 和类型推导

UPDATE1: C++17 为构造函数添加了类型推导——这并不意味着 free 函数是一个劣质的解决方案。

UPDATE2: C++17 增加了保证复制省略(复制在概念上甚至不发生)。因此,使用 C++17,我的代码实际上可以工作并且具有最佳性能。但是我相信 Martinho 的代码使用大括号初始化返回值仍然是更干净的解决方案。但是请查看Barry 的这个答案和 TC 的评论

旧帖子:类型推导不适用于构造函数(至少在 C++11 之前并包括在内)。常见的解决方案是依靠 RVO(返回值优化),编写一个 make_XYZ 模板函数,将其参数转发给构造函数。一个例子是std::make_tuple

任何模板 acrobat 知道在 nocopy 策略妨碍时使这项工作正常工作的解决方法吗?一个有效的解决方案必须仍然允许 RVO 发生。

此外,任何 make_XYZ 的要求会随着 C++14 消失吗?

0 投票
2 回答
70676 浏览

c++ - 什么是 string_view?

string_view是添加到 C++17的 C++ 库基础 TS( N3921 ) 中的一项提议功能

据我了解,它是一种代表某种字符串“概念”的类型,它是任何类型的容器的视图,可以将可视内容存储为字符串。

  • 这是正确的吗 ?
  • 规范 const std::string&参数类型应该变成string_view?
  • 还有一个重要的点string_view要考虑吗?
0 投票
1 回答
9067 浏览

c++ - C ++ 1z中的编译时反射?

C++ 标准化委员会中有一个研究小组提供 C++1z 或更高版本的编译时反射。我想知道究竟是什么目的以及预期的工具会有多强大?

例如,是否可以使用这些工具命名函数或类?

如果它没有这么强大,典型的用例会是什么?

0 投票
1 回答
1665 浏览

c++ - C++1z 的范围状态?

C++ 委员会中有一个关于范围的研究组:

http://isocpp.org/files/img/wg21-structure.png

但我没有关注这个研究组的历史,我不确定 C++1z 的预期交付方式是什么(此外我不使用 boost.range,因此我对现有实践没有清晰的认识)。我们会有:

  1. 范围作为一对第一个/最后一个迭代器?

  2. union 和其他对范围的集合操作(​​例如[v.begin()+5, v.begin()+7[ U [v.begin()+10, v.begin()+15[ U [v.begin()+21, v.begin()+42[),即:并集、交集、不相交并集、补集?

  3. 迭代器过滤器(为了在满足条件的情况下执行 for_each)?

  4. 其他事情?