请选择 进入手机版 | 继续访问电脑版

#楼主# 2020-3-25

跳转到指定楼层
选自modernescpp

作者:JP Tech等

机器之心编译

参与:Panda、杜伟

C++20(C++ 编程语言标准 2020 版)将是 C++ 语言一次非常重大的更新,将为这门语言引入大量新特性。C++ 开发者 Rainer Grimm 通过一系列博客文章介绍 C++20 的新特性。目前这个系列文章已经更新了两篇,本篇是第二篇,主要介绍了 C++20 的核心语言(包括一些新的运算符和指示符)。

C++20 的核心语言 之前的一篇博客概览式地介绍了 C++20 的概念、范围、协程和模块,下面开始介绍它的核心语言。

解读C++即将迎来的重大更新(二):C++20的核心语言-1.jpg

三路比较运算符 三路比较运算符  通常被称为太空船运算符。飞船运算符能确定两个值 A 和 B 谁大谁小或相等。 编译器可以自动生成三路比较运算符。你只需要用 default 礼貌地要求它即可。在这种情况下,你会得到所有六种比较运算符:==、!=、=。
#include
structMyInt{
intvalue;
MyInt(intvalue):value{value}{}
autooperator(constMyInt&)const=default;
};

默认的  执行的是字典顺序比较(lexicographical comparison),使用从基类开始从左到右并以声明顺序(declaration order)使用非静态元素的顺序。
微软的博客上有一些相当复杂精细的示例:https://devblogs.microsoft.com/cppblog/simplify-your-code-with-rocket-science-c20s-spaceship-operator/
structBasics{
inti;
charc;
floatf;
doubled;
autooperator(constBasics&)const=default;
};
structArrays{
intai[1];
charac[2];
floataf[3];
doublead[2][2];
autooperator(constArrays&)const=default;
};
structBases:Basics,Arrays{
autooperator(constBases&)const=default;
};
intmain(){
constexprBasesa={{0,'c',1.f,1.},
{{1},{'a','b'},{1.f,2.f,3.f},{{1.,2.},{3.,4.}}}};
constexprBasesb={{0,'c',1.f,1.},
{{1},{'a','b'},{1.f,2.f,3.f},{{1.,2.},{3.,4.}}}};
static_assert(a==b);
static_assert(!(a!=b));
static_assert(!(a=b);
}

我认为,这个代码段中最复杂的部分不是太空船运算符,而是使用聚合初始化(aggregate initialisation)来实现 Base 的初始化。聚合初始化本质上意味着如果所有元素是公开的,那么你可以直接初始化类类型(class、struct 或 union)的元素。在这个案例中,你可以使用示例中那样的 braced-initialisation-list。好吧,这确实经过了简化,详见:https://en.cppreference.com/w/cpp/language/aggregate_initialization 将字符串文字作为模板参数 在 C++20 之前,你不能将字符串用作非类型的模板参数。使用 C++20 时,你则可以这么做。我们可以在标准定义的 basic_fixed_string 中使用它们,其有一个 constexpr 构造函数。这个 constexpr 构造函数能在编译时实例化这个固定字符串。
template
classFoo{
staticconstexprcharconst*Name=T;
public:
voidhello()const;
};
intmain(){
Foofoo;
foo.hello();
}

constexpr 虚拟函数
由于动态类型是未知的,所以无法在常量表达式(constant expression)中调用虚拟函数。这个限制将在 C++20 中被解除。
指定初始化器
我首先谈谈聚合初始化。下面是一个简单示例:
//aggregateInitialisation.cpp
#include
structPoint2D{
intx;
inty;
};
classPoint3D{
public:
intx;
inty;
intz;
};
intmain(){
std::cout
转播转播 分享淘帖
回复

使用道具

0

主题

77

帖子

160

积分

注册会员

Rank: 2

积分
160
如朗随行 发表于 2020-3-25 11:14:09
这些所谓新特性基本都是语言垃圾,让本已复杂难懂的C++代码变的更为混乱,没人能看懂的地步,是时候放弃C++了
回复

使用道具 举报

1

主题

78

帖子

167

积分

注册会员

Rank: 2

积分
167
123457710 发表于 2020-3-25 11:14:14
更新这些细节并没有什么大用讲真。golang之所以几年时间就崛起不是偶然的,它把许许多多轮子都包含进来了,开发人员一句命令把轮子加载进来很省心马上就开始工作了,而c++这么多年,只是在语言文法上面小改,轮子上都需要第三方库,而且也不好用,越来越多做应用的都直接考虑用go而不是c++,而且go性能与c++几乎在同一等级。
回复

使用道具 举报

2

主题

75

帖子

162

积分

注册会员

Rank: 2

积分
162
haranN 发表于 2020-3-25 11:14:44
最近有人采访C++的创始人本贾尼博士“C++这么难学,你给大家说说该怎么学呗?”,本贾尼一拍大腿“哎呀妈呀,现在的C++我也不会啊!”
回复

使用道具 举报

0

主题

86

帖子

180

积分

注册会员

Rank: 2

积分
180
纸包里的氯化钠 发表于 2020-3-25 11:15:24
lambda表达式是最反人类的,密密麻麻的{}套圈里总有一款你会丢掉的,并且编译器检查不出来!
回复

使用道具 举报

1

主题

85

帖子

181

积分

注册会员

Rank: 2

积分
181
如心所愿1 发表于 2020-3-25 11:16:05
上一次重大更新我还停留在11,转眼间就20了
回复

使用道具 举报

0

主题

66

帖子

142

积分

注册会员

Rank: 2

积分
142
做我的仆人 发表于 2020-3-25 11:16:13
C++将是人类除了最难的高级编程语言了。
回复

使用道具 举报

0

主题

73

帖子

154

积分

注册会员

Rank: 2

积分
154
刘可563 发表于 2020-3-25 11:17:10
学不动了
回复

使用道具 举报

0

主题

71

帖子

152

积分

注册会员

Rank: 2

积分
152
张小麦坡 发表于 2020-3-25 11:18:06
这些语言是谁发明的,那天才会有中文的语言出现?
回复

使用道具 举报

2

主题

69

帖子

150

积分

注册会员

Rank: 2

积分
150
就是爱巴萨衣 发表于 2020-3-25 11:18:59
出一大堆没有一点用的特性,越来越复杂,关键需要的功能却没有
回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则