<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=C%2B%2B20</id>
	<title>C++20 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=C%2B%2B20"/>
	<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=C%2B%2B20&amp;action=history"/>
	<updated>2026-07-20T16:02:02Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://arolstar52-zhtest.hf.space/index.php?title=C%2B%2B20&amp;diff=3299699&amp;oldid=prev</id>
		<title>2026年1月19日 (一) 04:20 imported&gt;Joshua.nocturne</title>
		<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=C%2B%2B20&amp;diff=3299699&amp;oldid=prev"/>
		<updated>2026-01-19T04:20:58Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{NoteTA|G1=IT}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;C++20&amp;#039;&amp;#039;&amp;#039;，是继C++17之后的C++编程语言的ISO/IEC标准修订版的名称。&amp;lt;ref&amp;gt;{{cite web |title=The Standard : Standard C++ |url=https://isocpp.org/std/the-standard |website=isocpp.org |accessdate=2020-09-08 |archive-date=2020-09-19 |archive-url=https://web.archive.org/web/20200919050617/https://isocpp.org/std/the-standard |dead-url=no }}&amp;lt;/ref&amp;gt;2020年2月，该标准在布拉格的会议上由WG21进行了技术定稿&amp;lt;ref&amp;gt;{{cite web |title=C++ IS schedule |url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1000r3.pdf |accessdate=2020-09-08 |archive-date=2019-11-14 |archive-url=https://web.archive.org/web/20191114141143/http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1000r3.pdf |dead-url=no }}&amp;lt;/ref&amp;gt;。同年9月4日草案获得批准后，C++20同年12月正式發布。&amp;lt;ref&amp;gt;{{cite web |title=Current Status : Standard C++ |url=https://isocpp.org/std/status |website=isocpp.org |accessdate=2020-09-08 |archive-date=2020-09-08 |archive-url=https://web.archive.org/web/20200908083135/https://isocpp.org/std/status |dead-url=yes }}&amp;lt;/ref&amp;gt;相比 C++17，C++20引入了新的语言特性，如概念、模块、操作符“&amp;lt;=&amp;gt;”、协程、指派初始化、新标准属性等。C++20库标准还加入了范围、特性测试宏和位操作等。&lt;br /&gt;
== 特性改动 ==&lt;br /&gt;
=== 新增语言特性 ===&lt;br /&gt;
==== 功能特性测试 ====&lt;br /&gt;
自C++11之后标准引入了大量的C++语言、库特性，在20标准前为了区分这些特性是否生效只能判断C++标准。20标准为这些语言和程序库的功能特性定义了一组预处理器宏，使之成为检测这些功能特性是否存在的一种简单且可移植的方式。测试宏展开会得到该语言、库特性添加到标准草案中的年份和月份，如果该特性有显著变更，宏展开的时间也为更新。&lt;br /&gt;
* 属性测试宏&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
__has_cpp_attribute( 属性记号 )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
宏函数，用以检测属性是否支持，如：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#if __has_cpp_attribute(nodiscard) &amp;gt; 201603L&lt;br /&gt;
#pragma message(&amp;quot;nodiscard version is c++20&amp;quot;)&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* 语言特性测试宏&lt;br /&gt;
用以检测当前某个语言功能特性是否支持，单个宏，如：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#if __cpp_concepts &amp;gt;= 201907L&lt;br /&gt;
#pragma message(&amp;quot;support concepts&amp;quot;)&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 标准库特性测试宏&lt;br /&gt;
用以检测当前某个标准库特性是否支持，单个宏，不由编译器预定义，由&amp;lt;version&amp;gt;头文件定义：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#ifdef __cpp_lib_bitops&lt;br /&gt;
#pragma message(&amp;quot;support bitops&amp;quot;)&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 三路比较和比较操作符的默认 ====&lt;br /&gt;
新增三路比较运算符，又称spaceship operator，其形式为：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
左操作数 &amp;lt;=&amp;gt; 右操作数&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
表达式返回一个对象，使得&lt;br /&gt;
* 如果 a &amp;lt; b，那么 (a &amp;lt;=&amp;gt; b) &amp;lt; 0&lt;br /&gt;
* 如果 a &amp;gt; b，那么 (a &amp;lt;=&amp;gt; b) &amp;gt; 0&lt;br /&gt;
* 而如果 a 和 b 相等/等价，那么 (a &amp;lt;=&amp;gt; b) == 0。&lt;br /&gt;
三路比较操作符会作为&amp;lt; &amp;lt;= &amp;gt; &amp;gt;=四个操作符的重写候选，若决议选择了带参数顺序的operator&amp;lt;=&amp;gt;，则对于操作如x @ y，执行 x &amp;lt;=&amp;gt; y @ 0，对于不带参数顺序的执行 0 @ x &amp;lt;=&amp;gt; y。&lt;br /&gt;
&lt;br /&gt;
新增可以将比较操作符显式预置=default来要求编译器为某个类生成对应比较，比如：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Point&lt;br /&gt;
{&lt;br /&gt;
    int x;&lt;br /&gt;
    int y;&lt;br /&gt;
    auto operator&amp;lt;=&amp;gt;(const Point&amp;amp;) const = default;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 聚合体指派初始化 ====&lt;br /&gt;
聚合体初始化的语法糖，在c++11的聚合体初始化基础上，增加了可以指派具体值的语法：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct U {&lt;br /&gt;
  int a;&lt;br /&gt;
  float b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
U u1{ 1, 2.0 };&lt;br /&gt;
U u2{ .a = 1, .b = 2.0 };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== 范围for中的初始化语句和初始化器 ====&lt;br /&gt;
17标准中给if和switch语句加了初始化语句，20标准则给基于范围的for加了初始化语句：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
std::initializer_list&amp;lt;int&amp;gt; il{ 1, 2, 3 };&lt;br /&gt;
for (size_t index{ 0 }; auto&amp;amp; i : il) {&lt;br /&gt;
  std::cout &amp;lt;&amp;lt; std::format(&amp;quot;index {} value is {}&amp;quot;, index++, i) &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== UTF8字符基础类型char8_t ====&lt;br /&gt;
新增了基础类型char8_t用以表示UTF8字符，与11标准中的char16_t、char32_t一样同为语言关键字，char8_t的出现主要是为了和旧有的char区分，专门用于表示utf8字符。相对应的标准库`&amp;lt;string&amp;gt;`增加了std::u8string的别名，以下来自gcc13：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#if __cplusplus &amp;gt;= 201703L &amp;amp;&amp;amp; _GLIBCXX_USE_CXX11_ABI&lt;br /&gt;
#include &amp;lt;bits/memory_resource.h&amp;gt;&lt;br /&gt;
namespace std _GLIBCXX_VISIBILITY(default)&lt;br /&gt;
{&lt;br /&gt;
_GLIBCXX_BEGIN_NAMESPACE_VERSION&lt;br /&gt;
  namespace pmr {&lt;br /&gt;
    template&amp;lt;typename _CharT, typename _Traits = char_traits&amp;lt;_CharT&amp;gt;&amp;gt;&lt;br /&gt;
      using basic_string = std::basic_string&amp;lt;_CharT, _Traits,&lt;br /&gt;
					     polymorphic_allocator&amp;lt;_CharT&amp;gt;&amp;gt;;&lt;br /&gt;
    using string    = basic_string&amp;lt;char&amp;gt;;&lt;br /&gt;
#ifdef _GLIBCXX_USE_CHAR8_T&lt;br /&gt;
    using u8string  = basic_string&amp;lt;char8_t&amp;gt;;&lt;br /&gt;
#endif&lt;br /&gt;
    using u16string = basic_string&amp;lt;char16_t&amp;gt;;&lt;br /&gt;
    using u32string = basic_string&amp;lt;char32_t&amp;gt;;&lt;br /&gt;
    using wstring   = basic_string&amp;lt;wchar_t&amp;gt;;&lt;br /&gt;
  } // namespace pmr&lt;br /&gt;
_GLIBCXX_END_NAMESPACE_VERSION&lt;br /&gt;
} // namespace std&lt;br /&gt;
#endif // C++17&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 新属性 ====&lt;br /&gt;
===== no_unique_address =====&lt;br /&gt;
该属性适用于非位域非静态数据成员，指示编译器可以优化当前成员使其与其他非静态数据成员重叠，减少内存占用。如果该成员为空类型（不具有数据成员），则编译器优化为不占空间；如果该成员不为空，则其尾随填充空间可被其他数据成员占用。两个场景例子：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Empty {};&lt;br /&gt;
&lt;br /&gt;
struct WithEmpty {&lt;br /&gt;
  int32_t x;  // 4字节&lt;br /&gt;
  Empty e;  // 1字节（填充至对齐）&lt;br /&gt;
};  // 总大小8（4+1+3填充）&lt;br /&gt;
&lt;br /&gt;
struct WithEmptyAttri {&lt;br /&gt;
  int32_t x;  // 4字节&lt;br /&gt;
  [[no_unique_address]] Empty e;  // 优化为不占空间&lt;br /&gt;
};  // 总大小4字节&lt;br /&gt;
&lt;br /&gt;
struct NonEmpty {&lt;br /&gt;
  int32_t x;  // 4 字节&lt;br /&gt;
  [[no_unique_address]] char y;  // 1字节，无法优化，仍需对齐，*注意这里指定了no_unique_address&lt;br /&gt;
  // 3 字节填充&lt;br /&gt;
};  // 总大小8字节&lt;br /&gt;
&lt;br /&gt;
struct WithNonEmpty {&lt;br /&gt;
  NonEmpty ne;  // 8 字节，未指定no_unique_address，z不可复用ne空间&lt;br /&gt;
  char z;  // 1字节, 需对齐&lt;br /&gt;
  // 3 字节填充&lt;br /&gt;
};  // 总大小12字节&lt;br /&gt;
&lt;br /&gt;
struct Optimized {&lt;br /&gt;
  [[no_unique_address]] NonEmpty ne;  // 8 字节&lt;br /&gt;
  char z;  // 可以复用 ne 的尾随填充&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  static_assert(sizeof(WithEmpty) == 8);&lt;br /&gt;
  static_assert(sizeof(WithEmptyAttri) == 4);&lt;br /&gt;
  static_assert(sizeof(NonEmpty) == 8);&lt;br /&gt;
  static_assert(sizeof(WithNonEmpty) == 12);&lt;br /&gt;
  static_assert(sizeof(Optimized) == 8);&lt;br /&gt;
  WithNonEmpty wn;&lt;br /&gt;
  assert(&amp;amp;wn.z == &amp;amp;wn.ne.y + 4);&lt;br /&gt;
  Optimized o;&lt;br /&gt;
  assert(&amp;amp;o.z == &amp;amp;o.ne.y + 1);&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== likely与unlikely =====&lt;br /&gt;
现代cpu有指令预取和分支预测功能，在gcc以往也有__builtin_expect，相对应的20标准新增了likely和unlikely属性作为c++标准的分支预测优化属性，用于给程序员协助编译器完成分支预测。&lt;br /&gt;
&lt;br /&gt;
==== lambda更新 ====&lt;br /&gt;
===== lambda显式模板形参 =====&lt;br /&gt;
可以显式声明模板形参用以表示当前为泛型lambda，如：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
auto print = []&amp;lt;typename T&amp;gt;(const T &amp;amp;t) { /*...*/ };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====  lambda捕获参数包 =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
template &amp;lt;typename... Args&amp;gt;&lt;br /&gt;
auto FactoryByValue(Args&amp;amp;&amp;amp;... args) {&lt;br /&gt;
  return [... args = std::forward&amp;lt;Args&amp;gt;(args)]() {&lt;br /&gt;
    ((std::cout &amp;lt;&amp;lt; &amp;quot;Value:&amp;quot; &amp;lt;&amp;lt; args &amp;lt;&amp;lt; &amp;quot; Address:&amp;quot; &amp;lt;&amp;lt; &amp;amp;args &amp;lt;&amp;lt; std::endl), ...);&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
template &amp;lt;typename... Args&amp;gt;&lt;br /&gt;
auto FactoryByRef(Args&amp;amp;&amp;amp;... args) {&lt;br /&gt;
  return [&amp;amp;... args = std::forward&amp;lt;Args&amp;gt;(args)]() {&lt;br /&gt;
    ((std::cout &amp;lt;&amp;lt; &amp;quot;Value:&amp;quot; &amp;lt;&amp;lt; args &amp;lt;&amp;lt; &amp;quot; Address:&amp;quot; &amp;lt;&amp;lt; &amp;amp;args &amp;lt;&amp;lt; std::endl), ...);&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
以上代码中分别按值和按引用捕获了参数包，并通过一元右折叠(c++17功能)打开了参数包。&lt;br /&gt;
&lt;br /&gt;
=====  隐式按值捕获this的弃用 =====&lt;br /&gt;
20起须显式声明this的捕获方式，如下代码将被编译器告警：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct A {&lt;br /&gt;
  void Test() {&lt;br /&gt;
    auto f = [=]() { cout &amp;lt;&amp;lt; this &amp;lt;&amp;lt; endl; };&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  typename 关键字简化 ====&lt;br /&gt;
模板声明中typename的使用被简化，以下场景中无须再使用typename：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Data {&lt;br /&gt;
  using ValueType = int32_t;&lt;br /&gt;
  using ValuePointer = int32_t*;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
template &amp;lt;typename T&amp;gt;&lt;br /&gt;
struct Foo {&lt;br /&gt;
  using Type = T::ValueType;&lt;br /&gt;
  typedef T::ValuePointer Pointer;&lt;br /&gt;
&lt;br /&gt;
  T::ValueType val_;&lt;br /&gt;
&lt;br /&gt;
  T::ValueType Get();&lt;br /&gt;
&lt;br /&gt;
  auto Get(size_t index) -&amp;gt; T::ValuePointer;&lt;br /&gt;
&lt;br /&gt;
  template &amp;lt;typename U = T::ValuePointer&amp;gt;&lt;br /&gt;
  void Set(U u);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== consteval与constinit ====&lt;br /&gt;
===== consteval =====&lt;br /&gt;
新增关键字consteval，只可用于修饰函数，consteval修饰的函数必须是编译期执行：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
consteval int sqr(int x) {&lt;br /&gt;
  return x * x;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== constinit =====&lt;br /&gt;
constinit关键字仅可用于变量，表明该变量拥有静态初始化，即该变量的初值为编译期常量，亦即const initialize，仅可用于静态存储期和线程存储期的变量。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
const char* g() { return &amp;quot;动态初始化&amp;quot;; }&lt;br /&gt;
constexpr const char* f(bool p) { return p ? &amp;quot;常量初始化器&amp;quot; : g(); }&lt;br /&gt;
 &lt;br /&gt;
constinit const char* c = f(true);     // OK&lt;br /&gt;
// constinit const char* d = f(false); // 错误&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== constexpr 改动 ====&lt;br /&gt;
* constepxr函数可以使用try catch，但异常不允许出现在编译时：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
constexpr int Divide(int a, int b) {&lt;br /&gt;
    if (b == 0)&lt;br /&gt;
        throw std::runtime_error(&amp;quot;Division by zero&amp;quot;);&lt;br /&gt;
    return a / b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
constinit int i = Divide(1, 2); // 正常编译期常量&lt;br /&gt;
//constinit int j = Divide(1, 0); // 编译报错，编译期不允许出现异常&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 支持在constexpr函数内使用new、delete动态分配内存，如果是编译期运行则内存不能流出编译期之外：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
constexpr int* CreateArray(int size) {&lt;br /&gt;
    int* arr = new int[size];&lt;br /&gt;
    return arr;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
constexpr void ReleaseArray(int* p) {&lt;br /&gt;
    delete[] p;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
constexpr int Sum(int n) {&lt;br /&gt;
    int* p = CreateArray(n);&lt;br /&gt;
    std::iota(p, p + n, 1);  // constexpr since C++20&lt;br /&gt;
    auto t = std::accumulate(p, p + n, 0);  // constexpr since C++20&lt;br /&gt;
    ReleaseArray(p);&lt;br /&gt;
    return t;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
constinit int i = Sum(10); // 正常编译期计算累计值55&lt;br /&gt;
&lt;br /&gt;
// constinit int* p = CreateArray(100); // 编译出错，编译期内存不能出现在运行期&lt;br /&gt;
int* ap = CreateArray(100);  // constexpr函数可以是运行期函数&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* constexpr编译期函数可以是虚函数：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class Parent {&lt;br /&gt;
public:&lt;br /&gt;
    constexpr virtual ~Parent() = default;&lt;br /&gt;
&lt;br /&gt;
    constexpr virtual int GetID() {&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class Child : public Parent {&lt;br /&gt;
public:&lt;br /&gt;
    constexpr virtual ~Child() = default;&lt;br /&gt;
&lt;br /&gt;
    constexpr int GetID() override {&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
constinit int i = Parent().GetID();&lt;br /&gt;
constinit int j = Child().GetID();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* constexpr函数允许修改union活跃成员：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
union Test {&lt;br /&gt;
    int i;&lt;br /&gt;
    int j;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
constexpr int Foo()&lt;br /&gt;
{&lt;br /&gt;
    Test t{.i = 1};&lt;br /&gt;
    t.j = 2;&lt;br /&gt;
&lt;br /&gt;
    return t.j;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
constinit int i = Foo();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 标准库增加constexpr使用：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;vector&amp;gt;&lt;br /&gt;
#include &amp;lt;string&amp;gt;&lt;br /&gt;
#include &amp;lt;algorithm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
constexpr int Foo() {&lt;br /&gt;
  std::vector&amp;lt;int&amp;gt; v;&lt;br /&gt;
  v.emplace_back(9);&lt;br /&gt;
  v.emplace_back(99);&lt;br /&gt;
  v.emplace_back(123);  // vector::emplace_back 20起为constexpr&lt;br /&gt;
&lt;br /&gt;
  std::sort(v.begin(), v.end()); // std::sort 20起为constexpr&lt;br /&gt;
&lt;br /&gt;
  // std::remove_if 20起为constexpr&lt;br /&gt;
  const auto erase_start =&lt;br /&gt;
    std::remove_if(v.begin(), v.end(), [](auto&amp;amp; i) { return i &amp;lt; 100; } );&lt;br /&gt;
  v.erase(erase_start, v.end()); // vector::erase 20起为constexpr&lt;br /&gt;
&lt;br /&gt;
  std::string n = &amp;quot;Joshua&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  return v.size() + n.size(); // 两个size 20起都为constexpr&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
constinit int i = Foo();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 有符号整数必须以补码表示 ====&lt;br /&gt;
20标准起有符号整数必须以补码表示，N位有符号整数的取值范围也就固定为-(2&amp;lt;sup&amp;gt;N-1&amp;lt;/sup&amp;gt;-1)到2&amp;lt;sup&amp;gt;N-1&amp;lt;/sup&amp;gt;-1。&lt;br /&gt;
&lt;br /&gt;
==== 移位运算符的行为变化 ====&lt;br /&gt;
规范了左移、右移操作行为：&lt;br /&gt;
* 左移即是逐位左移并舍弃移出目标类型的位&lt;br /&gt;
* 右移即是算术右移&lt;br /&gt;
&lt;br /&gt;
==== 允许使用圆括号进行聚合初始化 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
struct U {&lt;br /&gt;
  int a;&lt;br /&gt;
  float b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  U u(1,2);&lt;br /&gt;
  std::cout &amp;lt;&amp;lt; u.a &amp;lt;&amp;lt; &amp;quot; &amp;quot; &amp;lt;&amp;lt; u.b &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 缩略函数模板 ====&lt;br /&gt;
函数模板可以省略`template&amp;lt;&amp;gt;`声明进行简写：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void f1(auto t) {} // =&amp;gt; template&amp;lt;class T&amp;gt; void f1(T);&lt;br /&gt;
&lt;br /&gt;
void f2(const auto&amp;amp; t, auto u) {} // =&amp;gt; template&amp;lt;class T, class U&amp;gt; void f2(const T&amp;amp;, U)&lt;br /&gt;
&lt;br /&gt;
void f3(std::integral auto) {} // =&amp;gt; template&amp;lt;std::integral T&amp;gt; void f3(T)&lt;br /&gt;
&lt;br /&gt;
void f4(std::integral auto&amp;amp;...) {} // =&amp;gt; template&amp;lt;std::integral... Ts&amp;gt; void f4(Ts&amp;amp;...)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 数组new 可推导数组长度 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int a[]{ 1, 2, 3, 4 };  // 11标准后编译通过&lt;br /&gt;
int* pa = new int[]{ 1, 2, 3, 4 }; // 20标准前无法通过编译，20后可以&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
标准规定在有列表初始化的情况下，可以通过列表个数来确定数组大小。&lt;br /&gt;
&lt;br /&gt;
== 注释 ==&lt;br /&gt;
{{reflist|2}}&lt;br /&gt;
&lt;br /&gt;
== 另见 ==&lt;br /&gt;
*[[C++]]&lt;br /&gt;
*[[C++23]]&lt;br /&gt;
*[[C++17]]&lt;br /&gt;
*[[C++14]]&lt;br /&gt;
*[[C++11]]&lt;br /&gt;
{{编程语言小作品}}&lt;br /&gt;
{{C++}}&lt;br /&gt;
&lt;br /&gt;
[[category:C++]]&lt;br /&gt;
[[Category:程式語言標準]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Joshua.nocturne</name></author>
	</entry>
</feed>