问题标签 [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.
c++ - 便携式分支预测提示
是否有任何可移植的方式来进行分支预测提示?考虑以下示例:
这与做有什么不同:
或者是使用编译器特定提示的唯一方法?(例如 GCC 上的 __builtin_expect)
编译器会根据if
条件的顺序对条件进行不同的处理吗?
c++ - 为什么 C++11 对值参数有隐式移动,但对右值参数没有?
在 C++11 中,值参数(和其他值)在返回时享受隐式移动:
至少在 MSVC 2010 中,右值引用参数需要std::move
:
我想在内部函数中,右值引用和值的行为相似,唯一的区别是在值的情况下,函数本身负责销毁,而对于右值引用,责任在外部。
在标准中区别对待它们的动机是什么?
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?
c++ - C++ 标准库中的哪些头文件保证包含另一个头文件?
C++ 标准库头文件可能以未指定的方式相互包含,因此程序员通常不应该依赖一个头文件包括另一个头文件。但是,在少数情况下,可以保证一个标头包含另一个标头,或者使某些功能可用,否则这些功能需要包含另一个标头。那些案例是什么?
c++ - 是否有等效于现代 C++ 中 python 的基于范围的“枚举”循环?
是否有等效enumerate
于 C++ 中 python 的基于范围的循环?我会想象这样的事情。
这可以用模板或宏来完成吗?
我知道我可以使用老式的 for 循环并迭代直到达到container.size()
. 但我很感兴趣如何使用模板或宏来解决这个问题。
编辑
在评论中的提示之后,我使用了 boost 迭代器。我得到了另一个使用 C++14 的工作解决方案。
c++ - 在现代 C++11/C++14/C++17 和未来的 C++20 中枚举到字符串
与所有其他类似问题相反,这个问题是关于使用新的 C++ 功能。
- 2008 c 有没有一种简单的方法可以将 C++ 枚举转换为字符串?
- 2008 c 在 C 中使用枚举类型的变量作为字符串的简单方法?
- 2008 c++ 如何轻松地将 c++ 枚举映射到字符串
- 2008 c++ 制作一个 C 标识符和一个字符串?
- 2008 c++ 是否有一个简单的脚本可以将 C++ 枚举转换为字符串?
- 2009 c++ 如何在 C++ 中使用枚举作为标志?
- 2011 c++ 如何将枚举类型变量转换为字符串?
- 2011 c++ 枚举到字符串 C++
- 2011 c++ 如何将枚举类型变量转换为字符串?
- 2012 c 如何在 c 中将枚举名称转换为字符串
- 2013 c 在 C 中对条件编译的枚举进行字符串化
在阅读了许多答案后,我还没有找到任何答案:
- 使用C++11、C++14或C++17新特性的优雅方式
- 或者在Boost中可以使用的东西
- 为C++20计划的其他内容
例子
一个例子通常比一个冗长的解释更好。您可以在Coliru
上编译和运行此代码段。(也可以使用另一个以前的示例)
约束
很高兴有
- 支持
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 class
和constexpr
函数的元编程技巧生成 C++ 代码......
c++ - 条件平凡的析构函数
发明一个可区分的联合/标记变体我得出结论,特别需要“在编译时的某些条件下使析构函数变得微不足道”这样的功能。我的意思是某种 SFINAE 或类似的东西(伪代码):
这意味着如果条件 in default(*)
is true
,则析构函数的定义等于~X() = default;
,但如果是false
则{ // ... }
使用 body 代替。
在这个使类U
成为文字类型的示例中(如果都是可简单破坏的),可以定义与类 ( )first, rest...
几乎相同的内容,但没有定义析构函数(即,如果所有降序类型都是文字,则为文字类型)。然后定义模板类型别名U
V
~U
并using tail = W< rest... >;
在U
和中重新定义V
。因此,有两个几乎相同的类,不同之处仅在于析构函数的存在。上述方法需要过多的代码重复。
该问题还涉及简单的复制/移动可分配类型以及operator =
类型为的所有其他条件std::is_trivially_copyable
。5 个条件总共提供了 2^5 种组合来实现。
是否有任何现成的技术(并且不那么冗长,然后在上面描述)可以在我想念的当前C++中表达,或者可能很快就会提出建议?
另一种可以考虑的方法是(语言特性)将析构函数标记为constexpr
并授予编译器以在实例化期间测试主体是否等同于平凡的。
更新:
正如评论中指出的那样简化了代码:union
变成了类似union
的类。删除了noexcept
说明符。
c++ - 如何在 Clang 中使用 C++ 模块?
模块是#includes 的替代品。Clang 有一个完整的 C++ 实现。如果我现在想通过 Clang 使用模块,我会怎么做?
使用
在 C++ 源文件中还不能工作(编译),因为模块的规范(包括语法)不是最终的。
Clang 文档指出,当传递标志时-fmodules
,#includes 将被重写为相应的导入。但是,检查预处理器会提示其他情况(test.cpp 仅包含#include <stdio.h>
一个空的 main):
-fmodules
此外,在完全没有标志的情况下编译这个测试文件会产生相同的目标文件。
我究竟做错了什么?
c++ - 我应该如何编写我的 C++ 来为 C++ 模块做好准备?
已经有两个编译器支持 C++ 模块:
- 铿锵声:http : //clang.llvm.org/docs/Modules.html
- MS VS 2015:http: //blogs.msdn.com/b/vcblog/archive/2015/12/03/c-modules-in-vs-2015-update-1.aspx
现在开始一个新项目时,我应该注意什么才能最终在我的编译器中发布模块功能?
是否可以使用模块并仍然保持与不支持它的旧编译器的兼容性?