using for Enumeration Values

  对比一下C++20前后的区别:

enum class State {
open,
progress,
done = 9
};
// Before C++20
void print(State s) {
switch (s) {
case State::open:
std::cout << "open\n";
break;
case State::done:
std::cout << "done\n";
break;
case State::progress:
std::cout << "progress\n";
break;
default:
assert(nullptr);
}
}
// Since C++20
void print1(State s) {
using enum State;
switch (s) {
case open:
std::cout << "open\n";
break;
case done:
std::cout << "done\n";
break;
case progress:
std::cout << "progress\n";
break;
default:
assert(nullptr);
}
} void print2(State s) {
using State::open, State::done, State::progress;
switch (s) {
case open:
std::cout << "open\n";
break;
case done:
std::cout << "done\n";
break;
case progress:
std::cout << "progress\n";
break;
default:
assert(nullptr);
}
}

Range-Based for Loop with Initialization

  基于范围的for循环是C++11引入的新特性,自C++20起,基于范围循环也可以进行初始化。

int main() {
std::vector v{1, 2, 3};
for (int i{1}; const auto& item : v)
std::cout << std::format("{}: {}\n", i++, item);
}

Feature Test Macros

  特性测试宏,正如其名,是为了当前版本编译器是否支持某个语言特性。这个宏以__cpp为前缀。

#if __cpp_generic_lambdas >= 201707
// generic lambdas with template parameters can be used
#endif #ifndef __cpp_lib_as_const
template <typename T>
const T& as_const(T& t) {
return t;
}
#endif

Attribute [[no_unique_address]]

#include <iostream>

struct Empty {};

struct I {
int i;
}; struct S {
Empty e;
int i;
}; int main() {
std::cout << "sizeof(Empty): " << sizeof(Empty) << '\n';
std::cout << "sizeof(I): " << sizeof(I) << '\n';
std::cout << "sizeof(S): " << sizeof(S) << '\n';
}

  空类为了区分不同对象的地址,字节大小是1;而结构体S由于内存对齐的原因,所以字节大小是8。输出结果毫无疑问是1,4,8。

#include <iostream>

struct Empty {};

// EBCO
struct S : Empty {
int i;
}; // no_unique_address
struct S2 {
[[no_unique_address]] Empty e;
int i;
}; int main() {
std::cout << "sizeof(Empty): " << sizeof(Empty) << '\n';
std::cout << "sizeof(S): " << sizeof(S) << '\n';
std::cout << "sizeof(S2): " << sizeof(S2) << '\n';
}

  注解标签no_unique_address能起到和空基类优化相同的效果。

Attributes [[likely]] and [[unlikely]]

  在if/else,switch分支当中都可以使用,帮助编译器作分支预测的优化。

int f(int n) {
if (n <= 0) [[unlikely]] {
return n;
} else {
return n * n;
}
} int g(int n) {
if (n <= 0) {
return n;
} else [[likely]] {
return n * n;
}
} int h(int n) {
switch (n) {
case 1:
//
break;
[[likely]] case 2:
//
break;
} return 0;
}

Attribute [[nodiscard]] with Parameter

  nodiscard用于修饰函数,当被修饰的函数发生调用(仅仅调用而不作赋值或者强制转换操作),编译器会报警告信息。

[[nodiscard]]
int f(int n) {
return n;
} int main() {
f(1); // Warning
int n = f(1); // OK
reinterpret_cast<int *>(f(1)); // OK
}

New Character Type char8_t

    using namespace std::literals;

    auto c = u8'c'; // char8_t
auto s = u8"Hello World"; // const char8_t *
auto str1 = u8"Hello World"s; // std::u8string
auto str2 = u8"Hello World"sv; // std::u8string_view std::cout << u8'c' << '\n'; // OK in C++17, error in C++20
std::cout << u8"Hello World\n"; // OK in C++17, error in C++20
std::cout << u8"Hello World\n"s; // OK in C++17, error in C++20
std::cout << u8"Hello World\n"sv; // OK in C++17, error in C++20 std::cout << c << '\n'; // OK in C++17, error in C++20
std::cout << s << '\n'; // OK in C++ 17, error in C++20
std::cout << str1 << '\n'; // OK in C++17, error in C++20
std::cout << str2 << '\n'; // OK in C++17, error in C++20

  更多的介绍将在下次带来,感谢支持

C++20语言核心特性的变化的更多相关文章

  1. JS 语言核心(JavaScript权威指南第六版)(阅读笔记)

    前言: 对于程序员,学习是无止境的,知识淘换非常快,能够快速稳固掌握一门新技术,是一个程序员应该具备的素质.这里将分享本人一点点不成熟的心得. 了解一门语言,了解它的概念非常重要,但是一些优秀的设计思 ...

  2. ES6核心特性

    摘要:聊JS离不开ES6啊! 原文:ES6核心特性 作者:ljianshu 前言 ES6 虽提供了许多新特性,但我们实际工作中用到频率较高并不多,根据二八法则,我们应该用百分之八十的精力和时间,好好专 ...

  3. Java Gradle入门指南之gretty插件(安装、命令与核心特性)

        Java Web应用开发时常使用Gradle来进行项目管理,可以十分便利地解决包依赖等问题.war插件的出现,让项目部署成为一个复制粘贴的过程,那有没有办法让Java web应用的部署,就像w ...

  4. (转)C++0x语言新特性一览

    转自:http://blog.csdn.net/zwvista/article/details/2429781 原文请见http://en.wikipedia.org/wiki/C%2B%2B0x. ...

  5. 第一章:Javascript语言核心

    本节是javascript语言的一个快速预览,也是本书的第一部分快速预览. 读此书之前,感谢淘宝技术团队对此javascript核心的翻译,感谢弗拉纳根写出此书.感谢你们无私的分享,仅以此笔记献给你们 ...

  6. 关于AngularJS学习整理---核心特性

    接触.学习AngularJS已经三个多月了,随着学习的深入,有些东西刚开始不明白,现在开始慢慢明白起来.于是,开始整理这几个月的学习成果.要不又要忘了...  初学Angular,是看到慕课网大漠穷秋 ...

  7. Angular四大核心特性

    Angular四大核心特性 Angular四大核心特性理论概述 MVC模式:它目的是为了分离视图.模型和控制器而设计出来的:其中数据模型用来储存数据,视图用来向用户展示应用程序,控制器充当模型和视图之 ...

  8. Zookeeper系列2 原生API 以及核心特性watcher

    原生API 增删改查询 public class ZkBaseTest { static final String CONNECT_ADDR = "192.168.0.120"; ...

  9. 乐字节-Java8核心特性实战之Stream(流)

    说起流,我们会想起手机 ,电脑组装流水线,物流仓库商品包装流水线等等.如果把手机 ,电脑,包裹看做最终结果的话,那么加工商品前的各种零部件就可以看做数据源,而中间一系列的加工作业操作,就可以看做流的处 ...

  10. 乐字节-Java8核心特性实战之函数式接口

    什么时候可以使用Lambda?通常Lambda表达式是用在函数式接口上使用的.从Java8开始引入了函数式接口,其说明比较简单:函数式接口(Functional Interface)就是一个有且仅有一 ...

随机推荐

  1. [db2]数据库管理

    前言 db2版本:10.5 实例所有者:db2inst1 待新建数据库:ticm,授权用户:ticm/123456.(用户是系统用户) 创建数据库 建库 # create database ticm: ...

  2. 《Web安全基础》01. 基础知识

    @ 目录 1:概念名词 1.1:域名 1.2:DNS 1.3:网站开发语言 1.4:后门 1.5:Web 1.6:Web 相关安全漏洞 2:数据包 2.1:HTTP 2.2:HTTPS 2.3:请求数 ...

  3. 《数据结构-C语言》单链表

    @ 目录 单链表 结构定义 初始化 建立 清空 求表长 判断是否为空表 取值 查找 插入 删除 销毁 遍历打印 测试 单链表 结构定义 #include <stdio.h> #includ ...

  4. phpstudy搭建虚拟域名

    phpstudy搭建虚拟域名 先使用phpstudy搭建好对应的环境 打开phpstudy控制面板,点击 其他选项菜单,选择 站点域名管理 输入网站虚拟域名,比如我这里DVWA靶场,我就写 www.d ...

  5. Go结构体深度探索:从基础到应用

    在Go语言中,结构体是核心的数据组织工具,提供了灵活的手段来处理复杂数据.本文深入探讨了结构体的定义.类型.字面量表示和使用方法,旨在为读者呈现Go结构体的全面视角.通过结构体,开发者可以实现更加模块 ...

  6. destoon上做纯js实现html指定页面导出word

    因为最近做了范文网站需要,所以要下载为word文档,如果php进行处理,很吃后台服务器,所以想用前端进行实现.查询github发现,确实有这方面的插件. js导出word文档所需要的两个插件: 1 2 ...

  7. c语言代码练习--函数

    函数: 一,概念: 1,在计算科学中,子程序(英语:Subroutione,procedure,function,rotine,method.subprogram,callable unit),是一个 ...

  8. Python基础——CPU详解

    一 五大组成单元=>三大核心组件 组成计算机五大单元可以合并成三大核心组件:CPU.IO设备.主存储器 1.控制单元+算数逻辑单元=>CPU 2.主存储器,即主記憶體 3.输入单元Inpu ...

  9. Thinking in Java 4th Edition Source Code

    Thinking in Java 4th Edition Source Code Instructions for downloading, installing and testing the so ...

  10. docker入门加实战——docker安装并配置阿里云加速

    docker入门加实战--docker安装并配置阿里云加速 为什么要学习docker 在开发和部署项目的过程中,经常会遇到如下问题: 软件安装包名字复杂,不知道去哪里找 安装软件和部署项目步骤复杂,容 ...