问题标签 [c++20]

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 回答
4325 浏览

c++ - std::decay 和 std::remove_reference 之间的区别

在 C++ 中进行模板元编程时,我经常遇到如下情况:

我知道我应该std::decay在返回类型中使用类似的东西,但为什么不能std::remove_reference正常工作?这里有什么区别?怎么样std::remove_cvref

0 投票
1 回答
717 浏览

c++ - C++17,不推荐使用的函数标准库?

我只是意识到动态内存管理标准库的某些功能已在 C++17 中被弃用。一个例子是get_temporary_buffer

有人可以解释为什么吗?我可以期望在 C++20 中有替代方案吗?

0 投票
0 回答
139 浏览

c++ - 当前编译器与 c++ 概念的可用性

很久以前,我开始阅读 C++ 概念。过了一段时间,很多东西都被丢弃了,概念精简版诞生了。但是,concepts lite 也没有进入 C++11/14/17 标准。

正如我所读到的,c++ 标准委员会决定在 c++17 草案中再次添加概念。https://www.reddit.com/r/cpp/comments/6ngkgc/2017_toronto_iso_c_committee_discussion_thread/

还有一个新的概念提案,可以在这里找到: http ://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0734r0.pdf

它与旧版本不同: http ://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4377.pdf

我现在对周围的所有文档有点困惑。

但这对于当前可用的实现意味着什么?当前的 gcc 7.2 编译器是否已用于尝试概念的第一步?有没有人检查过可用的实施与新的工作草案有何不同?因为我在阅读 sepcs 和草稿时遇到了一些困难(我不是语言律师),如果有人能解释当前的 gcc 实现与最后的工作草案之间的主要差异,那就太好了。

提示:对于其他想要测试它的人,只需启用 gcc 7.2 中的概念:--std=c++17 -fconcepts

0 投票
2 回答
538 浏览

c++ - 为什么 c++ 概念的名称在 PascalCase 中?

这让我很奇怪。

为什么 c++ 概念的名称不使用小写字母?

我还应该开始将命名切换到 PascalCase 吗?

0 投票
3 回答
11956 浏览

c++ - 三向比较运算符与减法有何不同?

C++20 中有一个新的比较运算符<=>。但是我认为在大多数情况下,简单的减法效果很好:

它们具有相同的效果。我真的无法理解其中的区别。

0 投票
4 回答
10013 浏览

c++ - 便携式检测 __VA_OPT__ 支持?

在 C++20 中,__VA_OPT__如果参数的数量大于零,预处理器支持作为可选扩展可变参数宏中的标记的一种方式。(这消除了对##__VA_ARGS__GCC 扩展的需要,这是一种不可移植且丑陋的 hack。)

Clang SVN 已经实现了这个特性,但是他们没有为它添加一个特性测试宏。任何聪明的预处理器黑客能否找到一种方法来检测是否存在__VA_OPT__支持,而不会导致硬错误或可移植性警告?

0 投票
3 回答
3233 浏览

c++ - 三向比较运算符总是有效的吗?

Herb Sutter 在他对“宇宙飞船”操作员的提议(第 2.2.2 节,第 12 页底部)中说:

基于所有内容<=>及其返回类型:此模型具有主要优势,与以前的 C++ 提案和其他语言的功能相比,此提案有一些独特之处:

[...]

(6)效率,包括最终实现比较的零开销抽象:绝大多数比较总是单通的。唯一的例外是在同时支持部分排序​​和相等的类型的情况下<=生成。>=For <,single-pass 对于实现零开销原则以避免重复相等比较是必不可少的,例如 for struct Employee { string name; /*more members*/ };used in struct Outer { Employeee; /*more members*/ };- 今天的比较违反了零开销抽象,因为operator<onOuter执行冗余相等比较,因为它执行if (e != that.e) return e < that.e;遍历相等前缀 e.name两次(如果名称相等,则遍历其他成员的相等前缀Employee两倍),这通常不能被优化掉。正如 Kamiński 所指出的,零开销抽象是 C++ 的支柱,第一次实现它以进行比较是这种基于<=>.

但随后他给出了这个例子(第 1.4.5 节,第 6 页):

会定义operator>(a,b)a<=>b > 0不会导致大量开销吗?(尽管形式与他讨论的不同)。该代码将首先测试是否相等,然后测试 ,less最后greater测试 ,而不是仅直接测试greater.

我在这里错过了什么吗?

0 投票
1 回答
1652 浏览

c++ - 在 C++20 中获取当前日期/时间是否是线程安全的?

简短的问题

直到并包括 C++17,C++ 都没有提供线程安全的方法来获取当前时间或日期。这会在 C++20 中修复吗?

长问题

获取当前时间和日期的唯一可移植方法是使用 std::gmtime 或 std::localtime 函数。C 早期的残余,这些函数将自实现定义的纪元以来的给定时间转换为日历时间(例如,1515153600 转换为 2018 年 1 月 5 日星期五 12:00:00 GMT)。然而,唯一的缺点是这些函数返回一个指向内部静态变量的指针并且不是线程安全的。更糟糕的是,这个静态变量可能被所有相关函数共享,例如 std::gmtime、std::localtime 和 std::ctime,并且可能在每次调用这些函数时被覆盖。因此,如果您正在使用线程并希望定期检查您冒着数据竞争和未定义行为的风险的时间。

显然,当前的标准在这方面被打破了。C++ 标准委员会是否有任何努力来解决这种情况,这有多大可能包含在 C++20 中?

0 投票
1 回答
450 浏览

c++ - C++ 概念是否允许我的类在声明/定义时指定它满足某些概念?

目前我能想到的最好方法是使用 static_assert,但我更喜欢更好的方法。

0 投票
1 回答
438 浏览

c++ - 如何现代化 VC++17/20 的分配器适配器

我有一个分配器适配器,我称之为ctor_allocator. 我写它更多是为了实验而不是为了任何实际需要。它使分配器在可行时使用默认构造,从而通过分配绕过任何默认初始化。例如,双精度向量的构造不会将值初始化为 0.0(或任何值)。

适配器中的许多代码都是旧式的,而且看起来可能很快就会被弃用,如果还没有的话。在不违背其目的的情况下,我还没有成功地对代码进行现代化改造。例如,如果我删除struct rebind模板,则零初始化返回。

你能展示如何对其进行现代化改造吗?

答案可能对其他应用程序具有指导意义。

编辑:在评论中,布兰登将这两个链接作为“新方式”的示例。SO问题最小示例。两者都不能防止使用零进行初始化,这发生在construct. 但是,如果我通过添加void construct(U* ptr)模板来修改任一示例,则可以避免零初始化。这回答了一个与我在这里提出的不同的问题,但它是一个好问题的好答案。