C++20语言核心特性的变化
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语言核心特性的变化的更多相关文章
- JS 语言核心(JavaScript权威指南第六版)(阅读笔记)
前言: 对于程序员,学习是无止境的,知识淘换非常快,能够快速稳固掌握一门新技术,是一个程序员应该具备的素质.这里将分享本人一点点不成熟的心得. 了解一门语言,了解它的概念非常重要,但是一些优秀的设计思 ...
- ES6核心特性
摘要:聊JS离不开ES6啊! 原文:ES6核心特性 作者:ljianshu 前言 ES6 虽提供了许多新特性,但我们实际工作中用到频率较高并不多,根据二八法则,我们应该用百分之八十的精力和时间,好好专 ...
- Java Gradle入门指南之gretty插件(安装、命令与核心特性)
Java Web应用开发时常使用Gradle来进行项目管理,可以十分便利地解决包依赖等问题.war插件的出现,让项目部署成为一个复制粘贴的过程,那有没有办法让Java web应用的部署,就像w ...
- (转)C++0x语言新特性一览
转自:http://blog.csdn.net/zwvista/article/details/2429781 原文请见http://en.wikipedia.org/wiki/C%2B%2B0x. ...
- 第一章:Javascript语言核心
本节是javascript语言的一个快速预览,也是本书的第一部分快速预览. 读此书之前,感谢淘宝技术团队对此javascript核心的翻译,感谢弗拉纳根写出此书.感谢你们无私的分享,仅以此笔记献给你们 ...
- 关于AngularJS学习整理---核心特性
接触.学习AngularJS已经三个多月了,随着学习的深入,有些东西刚开始不明白,现在开始慢慢明白起来.于是,开始整理这几个月的学习成果.要不又要忘了... 初学Angular,是看到慕课网大漠穷秋 ...
- Angular四大核心特性
Angular四大核心特性 Angular四大核心特性理论概述 MVC模式:它目的是为了分离视图.模型和控制器而设计出来的:其中数据模型用来储存数据,视图用来向用户展示应用程序,控制器充当模型和视图之 ...
- Zookeeper系列2 原生API 以及核心特性watcher
原生API 增删改查询 public class ZkBaseTest { static final String CONNECT_ADDR = "192.168.0.120"; ...
- 乐字节-Java8核心特性实战之Stream(流)
说起流,我们会想起手机 ,电脑组装流水线,物流仓库商品包装流水线等等.如果把手机 ,电脑,包裹看做最终结果的话,那么加工商品前的各种零部件就可以看做数据源,而中间一系列的加工作业操作,就可以看做流的处 ...
- 乐字节-Java8核心特性实战之函数式接口
什么时候可以使用Lambda?通常Lambda表达式是用在函数式接口上使用的.从Java8开始引入了函数式接口,其说明比较简单:函数式接口(Functional Interface)就是一个有且仅有一 ...
随机推荐
- 实在智能TARS-RPA-Agent,业界首发的产品级大模型Agent有何非凡之处?
融合LLM的RPA进化到什么程度? AIGC如何借AI Agent落地? 像生成文本一样生成流程的ChatRPA,能够提升RPA新体验? 边探索边创建的ChatRPA,能否破解RPA与LLM融合难题? ...
- 安装iTerm2和oh-my-zsh
安装iTerm2和oh-my-zsh 此文是在参考许多教程(见目录:参考)并结合本人安装经历写下的一篇关于iTerm2和oh-my-zsh的认识和超级详细安装教程.全文所有图片均为本人截屏拍摄.希望能 ...
- 如何做一个api接口?
程序员是公司里的技术岗位,是产品经理最亲密的伙伴.但是程序员可以理解产品经理的工作,产品经理却不一定理解程序员的工作,所以经常被无良程序员欺骗.从API接口这个维度,分析API的概念以及为什么要了解它 ...
- Vue用v-bind给标签属性赋值 src, href...
给属性渲染数据不能使用 {{name}} 标记, 请使用 v-bind:属性名称="name" name是json数据键值对中的键名, 请配合下面JS代码片食用 HTML < ...
- 基于间隔密度的概念漂移检测算法mdm-DDM
概念漂移 概念漂移是数据流挖掘领域中一个重要的研究点.传统的机器学习算法在操作时通常假设数据是静态的,其数据分布不会随着时间发生变化.然而对于真实的数据流来说,由于数据流天生的时间性,到达的数据的 ...
- 「codeforces - 1633F」Perfect Matching
link. 首先所有的 activated nodes 组合成了一棵以 \(1\) 为根的有根树.询问即求由 activated nodes 组成的树的最大匹配.对于树上最大匹配有一个贪心策略:自底向 ...
- Nearest cluster-based intrusion detection through convolutional neural networks 笔记
Nearest cluster-based intrusion detection through convolutional neural networks 技术要点 So, the primary ...
- Llama2-Chinese项目:4-量化模型
一.量化模型调用方式 下面是一个调用FlagAlpha/Llama2-Chinese-13b-Chat[1]的4bit压缩版本FlagAlpha/Llama2-Chinese-13b-Chat-4 ...
- Rethinking Point Cloud Registration as Masking and Reconstruction论文阅读
Rethinking Point Cloud Registration as Masking and Reconstruction 2023 ICCV *Guangyan Chen, Meiling ...
- 将python程序打包为exe可执行文件方法
将py打包为exe文件需要依赖pyinstaller第三方库 -F:打包后只生成单个exe格式文件: -D:默认选项,创建一个目录,包含exe文件以及大量依赖文件: -c:默认选项,使用控制台(就是类 ...