问题标签 [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 投票
6 回答
11879 浏览

c++ - 便携式分支预测提示

是否有任何可移植的方式来进行分支预测提示?考虑以下示例:

这与做有什么不同:

或者是使用编译器特定提示的唯一方法?(例如 GCC 上的 __builtin_expect)

编译器会根据if条件的顺序对条件进行不同的处理吗?

0 投票
3 回答
4939 浏览

c++ - 为什么 C++11 对值参数有隐式移动,但对右值参数没有?

在 C++11 中,值参数(和其他值)在返回时享受隐式移动:

至少在 MSVC 2010 中,右值引用参数需要std::move

我想在内部函数中,右值引用和值的行为相似,唯一的区别是在值的情况下,函数本身负责销毁,而对于右值引用,责任在外部。

在标准中区别对待它们的动机是什么?

0 投票
4 回答
11166 浏览

c++ - What exactly are C++ modules?

I've been following up C++ standardization and came across C++ modules idea. I could not find a good article on it. What exactly is it about?

0 投票
1 回答
3365 浏览

c++ - 在通用 lambda 中使用模板参数

GCC允许以下语法作为扩展:

在2012 年通用 lambda 提案n3418中,我们看到了允许上述内容的语法:

然而,由于它是一个扩展,语法显然不存在(或不允许)。在什么情况下,当我们有 auto 时,上面的内容会有用,为什么语法不存在(或不允许)?

0 投票
2 回答
1730 浏览

c++ - C++ 标准库中的哪些头文件保证包含另一个头文件?

C++ 标准库头文件可能以未指定的方式相互包含,因此程序员通常不应该依赖一个头文件包括另一个头文件。但是,在少数情况下,可以保证一个标头包含另一个标头,或者使某些功能可用,否则这些功能需要包含另一个标头。那些案例是什么?

0 投票
8 回答
3241 浏览

c++ - 是否有等效于现代 C++ 中 python 的基于范围的“枚举”循环?

是否有等效enumerate于 C++ 中 python 的基于范围的循环?我会想象这样的事情。

这可以用模板或宏来完成吗?

我知道我可以使用老式的 for 循环并迭代直到达到container.size(). 但我很感兴趣如何使用模板或宏来解决这个问题。

编辑

在评论中的提示之后,我使用了 boost 迭代器。我得到了另一个使用 C++14 的工作解决方案。

https://gist.github.com/kain88-de/fef962dc1c15437457a8

0 投票
32 回答
268415 浏览

c++ - 在现代 C++11/C++14/C++17 和未来的 C++20 中枚举到字符串

与所有其他类似问题相反,这个问题是关于使用新的 C++ 功能。

在阅读了许多答案后,我还没有找到任何答案:

例子

一个例子通常比一个冗长的解释更好。您可以在Coliru
上编译和运行此代码段。也可以使用另一个以前的示例)

约束

  • 请不要无价值地重复其他答案基本链接
  • 请避免臃肿的基于宏的答案,或尽量减少#define开销。
  • 请不要使用手册enum->string映射。

很高兴有

  • 支持enum从不为零的数字开始的值
  • 支持enum负值
  • 支持碎片化enum
  • 支持class enum(C++11)
  • 支持class enum : <type>任何允许的<type>(C++11)
  • 编译时(不是运行时)转换为字符串,
    或者至少在运行时快速执行(例如std::map,这不是一个好主意......)
  • constexpr(C++11,然后在 C++14/17/20 中放宽)
  • noexcept(C++11)
  • C++17 / C++20友好代码片段

一种可能的想法是使用 C++ 编译器功能在编译时使用基于variadic template classconstexpr函数的元编程技巧生成 C++ 代码......

0 投票
1 回答
1811 浏览

c++ - 条件平凡的析构函数

发明一个可区分的联合/标记变体我得出结论,特别需要“在编译时的某些条件下使析构函数变得微不足道”这样的功能。我的意思是某种 SFINAE 或类似的东西(伪代码):

这意味着如果条件 in default(*)is true,则析构函数的定义等于~X() = default;,但如果是false{ // ... }使用 body 代替。

在这个使类U成为文字类型的示例中(如果都是可简单破坏的),可以定义与类 ( )first, rest...几乎相同的内容,但没有定义析构函数(即,如果所有降序类型都是文字,则为文字类型)。然后定义模板类型别名UV~U

using tail = W< rest... >;U和中重新定义V。因此,有两个几乎相同的类,不同之处仅在于析构函数的存在。上述方法需要过多的代码重复。

该问题还涉及简单的复制/移动可分配类型以及operator =类型为的所有其他条件std::is_trivially_copyable5 个条件总共提供了 2^5 种组合来实现

是否有任何现成的技术(并且不那么冗长,然后在上面描述)可以在我想念的当前C++中表达,或者可能很快就会提出建议

另一种可以考虑的方法是(语言特性)将析构函数标记为constexpr并授予编译器以在实例化期间测试主体是否等同于平凡的。

更新:

正如评论中指出的那样简化了代码:union变成了类似union的类。删除了noexcept说明符。

0 投票
2 回答
18362 浏览

c++ - 如何在 Clang 中使用 C++ 模块?

模块是#includes 的替代品。Clang 有一个完整的 C++ 实现。如果我现在想通过 Clang 使用模块,我会怎么做?


使用

在 C++ 源文件中还不能工作(编译),因为模块的规范(包括语法)不是最终的。


Clang 文档指出,当传递标志时-fmodules,#includes 将被重写为相应的导入。但是,检查预处理器会提示其他情况(test.cpp 仅包含#include <stdio.h>一个空的 main):

-fmodules此外,在完全没有标志的情况下编译这个测试文件会产生相同的目标文件。

我究竟做错了什么?

0 投票
2 回答
17488 浏览

c++ - 我应该如何编写我的 C++ 来为 C++ 模块做好准备?

已经有两个编译器支持 C++ 模块:

现在开始一个新项目时,我应该注意什么才能最终在我的编译器中发布模块功能?

是否可以使用模块并仍然保持与不支持它的旧编译器的兼容性?