C++20
发布时间:2018/12/5 10:23:51 访问次数:37444
- 51电子网公益库存:
- CAT24C08YI-GT3
- CAT24C128LI-G
- CAT24C16C4ATR
- CAT24C16WI-GT3
- CBT3257ABQ,115
- CBTL04043A1EXJ
- CBTL1608A1UK,019
- CC2530F128RHAR
- CC2640F128RHBT
- CD40106BM96
- 2N5087G
- 2N7002
- 2N7002,215
- 2N7002ET1G
- 2SC3648T-TD-E
- 2SC5508-T2B-A
- 2V7002KT1G
- 2SC5508-T2B-A
- 2SK2313
- 2SC5508-T2B-A
c++20的重要特性:conceptsrangesmodulescoroutinesreflection接下来让我们慢慢揭开c++20的面纱,看看这些特性到底是什么样的,它们解决了什么问题。1.concepts在谈concepts之前我想先介绍一下concepts提出的背景和原因。众所周知,因为c++的模版和模版元具备非常强大的泛型抽象能力并且是zero overhead,所以模版在c++中备受推崇,大获成功,在各种c++库(如stl)中被广泛使用。
然而,模版编程还存在一些问题,比如有些模版的代码写起来比较困难,读起来比较难懂,尤其是编译出错的时候,那些糟糕的让人摸不着头脑的错误提示让人头疼。因此,c++之父bjarne stroustrup很早就希望对模版做一些改进,让c++的模版编程变得简单好写,错误提示更明确。他早在1987年就开始做这方面的尝试了。c++之父bjarne stroustrup具体思路就是给模版参数加一些约束,这些约束相比之前的写法具有更强的表达能力和可读性,会简化c++的泛型模版代码的编写。
所以concepts的出现主要是为了简化泛型编程,一个concept就是一个编译期判断,用于约束模版参数,concepts则是这些编译期判断的合集。下面通过一个例子来展示concepts是如何简化模版编程的。http://yushuollp.51dzw.com
比如有这样一个类b,我们调用它的成员函数tostring时,对t类型进行限定,即限定t类型是std::string的可转换类型,这样做的目的是为了更安全,能在编译期就能检查错误。这里通过c++14的std::enableif_t来对t进行限定,但是长长的enableift看起来比较冗长繁琐,头重脚轻。来看看用concepts怎么写这个代码的。
template
class b {
public:
template
typename std::enable_if_t
to_string() const {
return "class b<>";
}
};
b
std::cout << b1.to_string() << std::endl; // compile error!
b
std::cout << b2.to_string() << std::endl; // ok!
可以看到,requires castabletostring比之前长长的enableift要简洁不少,代码可读性也更好,castabletostring就是一个concept,一个限定t为能被转换为std::string类型的concept,通过requires相连接,语义上也更明确了,而且这个concept还可以复用。
concepts的这个语法也可能在最终的c++20中有少许不同,有可能还会变得更简洁,现在语法有几个候选版本,还没最终投票确定。2.ranges相比stl,ranges是更高一层的抽象,ranges对stl做了改进,它是stl的下一代。为什么说ranges是stl的未来?虽然stl在c++中提供的容器和算法备受推崇和广泛被使用,但stl一直存在两个问题:stl强制你必须传一个begin和end迭代器用来遍历一个容器;stl算法不方便组合在一起。stl必须传迭代器,这个迭代器仅仅是辅助你完成遍历序列的技术细节,和我们的函数功能无关,大部分时候我们需要的是一个range,代表的是一个比迭代器更高层的抽象。
那么ranges到底是什么呢?ranges是一个引用元素序列的对象,在概念上类似于一对迭代器。这意味着所有的stl容器都是ranges。在ranges里我们不再传迭代器了,而是传range。比如下面的代码:
stl写法:
std::vector
std::sort(v.begin(), v.end());
ranges写法:
std::sort(v);
stl有时候不方便将一些算法组合在一起,来看一个例子:
std::vector
std::vector
std::copy_if(v.begin(), v.end(), std::back_inserter(event_numbers), [](int i){ return i % 2 == 0;});
std::vector
std::transform(event_numbers.begin(), event_numbers.end(), std::back_inserter(event_numbers), [](int i){ return i * 2;});
for(int n : results){
std::cout<
}
//最终会输出 4 8
上面这个例子希望得到vector中的偶数乘以2的结果,需求很简单,但是用stl写起来还是有些冗长繁琐,中间还定义了两个临时变量。如果用ranges来实现这个需求,代码就会简单得多。
auto results = v | ranges::view::filter([](int i){ return i % 2 == 0; })
| ranges::view::transform([](int i){ return i * 2; });
用concetps我们可以很方便地将算法组合在一起,写法更简单,语义更清晰,并且还可以实现延迟计算避免了中间的临时变量,性能也会更好。http://yushuo1.51dzw.com
concepts从设计上改进了之前stl的两个问题,让我们的容器和算法变得更加简单好用,还容易组合。3.modules一直以来c++一直通过引用头文件方式使用库,而其他90年代以后的语言比如java、c#、go等语言都是通过import包的方式来使用库。现在c++决定改变这种情况了,在c++20中将引入modules,它和java、go等语言的包的概念是类似的,直接通过import包来使用库,再也看不到头文件了。
为什么c++20不再希望使用#include方式了?因为使用头文件方式存在不少问题,比如有include很多模版的头文件将大大增加编译时间,代码生成物也会变大。而且引用头文件方式不利于做一些c++库和组件的管理工具,尤其是对于一些云环境和分布式环境下不方便管理,c++一直缺一个包管理工具,这也是c++被吐槽得很多的地方,现在c++20 modules将改变这一切。
modules在程序中的结构如下图:上面的图中,每个方框表示一个翻译单元,存放在一个文件里并且可以被独立编译。每个module由module接口和实现组成,接口只有一份,实现可以有多份。
modules接口和实现的语法:
export module module_name;
module module_name;
使用modules:
import module_name;
modules允许你导出类,函数,变量,常量和模版等等。
接下来看一个使用modules的例子:
import std.vector; // #include
import std.string; // #include
import std.iostream; // #include
import std.iterator; // #include
int main() {
using namespace std;
vector
"socrates", "plato", "descartes", "kant", "bacon"
};
copy(begin(v), end(v), ostream_iterator
"));
}
可以看到不用再include了,直接去import需要用到的modules即可,是不是有种似曾相识的感觉呢。曾看到一个人说如果c++支持了modules他就会从java回归到c++,也说明这个特性也是非常受关注和期待的。4.coroutines很多语言提供了coroutine机制,因为coroutine可以大大简化异步网络程序的编写,现在c++20中也要加入协程了(乐观估计c++20加入,悲观估计在c++23中加入)。
如果不用协程,写一个异步的网络程序是不那么容易的,以boost.asio的异步网络编程为例,我们需要注意的地方很多,比如异步事件完成的回调函数中需要保证调用对象仍然存在,如何构建异步回调链条等等,代码比较复杂,而且出了问题也不容易调试。而协程给我们提供了对异步编程优雅而高效的抽象,让异步编程变得简单!
c++ courotines中增加了三个新的关键字:co_await,co_yield和co_return,如果一个函数体中有这三个关键字之一就变成coroutine了。http://yushuo.51dzw.com
co_await用来挂起和恢复一个协程,co_return用来返回协程的结果,co_yield返回一个值并且挂起协程。
下面来看看如何使用它们。
写一个lazy sequence:
generator
for (int current=start; current+= step)
co_yield current;
}
for(auto n : get_integers(0, 5)){
std::cout<
}
std::cout<<'
';
上面的例子每次调用get_integers,只返回一个整数,然后协程挂起,下次调用再返回一个整数,因此这个序列不是即时生成的,而是延迟生成的。
接下来再看一下co_wait是如何简化异步网络程序的编写的:
char data[1024];
for (;;)
{
std::size_t n = co_await socket.async_read_some(boost::asio::buffer(data), token);
co_await async_write(socket, boost::asio::buffer(data, n), token);
}
这个例子仅仅用了四行代码就完成了异步的echo,非常简洁!co_await会在异步读完成之前挂起协程,在异步完成之后恢复协程继续执行,执行到async_write时又会挂起协程直到异步写完成,异步写完成之后继续异步读,如此循环。如果不用协程代码会比较繁琐,需要像这样写:
void do_read()
{
auto self(shared_from_this());
socket_.async_read_some(boost::asio::buffer(data_, max_length),
[this, self](boost::system::error_code ec, std::size_t length)
{
if (!ec)
{
do_write(length);
}
});
}
void do_write(std::size_t length)
{
auto self(shared_from_this());http://yushuokj.51dzw.com
boost::asio::async_write(socket_, boost::asio::buffer(data_, length),
[this, self](boost::system::error_code ec, std::size_t /*length*/)
{
if (!ec)
{
do_read();
}
});
}
可以看到,不使用协程来写异步代码的话,需要构建异步的回调链,需要保持异步回调的安全性等等。而使用协程可以大大简化异步网络程序的编写。5.reflectionc++中一直缺少反射功能,其他很多语言如java、c#都具备运行期反射功能。反射可以用来做很多事情:比如做对象的序列化,把对象序列化为json、xml等格式,以及orm中的实体映射,还有rpc远程过程(方法)调用等,反射是应用程序中非常需要的基础功能。现在c++终于要提供反射功能了,c++20中可会将反射作为实验库,在c++23中正式加入到标准中。
在反射还没有进入到c++标准之前,有很多人做了一些编译期反射的库,比如purecpp社区开源的序列化引擎iguana,以及orm库ormpp,都是基于编译期反射实现的。然后,非语言层面支持的反射库存在种种不足之处,比如在实现上需要大量使用模版元和宏、不能访问私有成员等问题。
现在c++终于要提供完备地编译期反射功能了,为什么是编译期反射而不是像其它语言一样提供运行期反射,因为c++的一个重要设计哲学就是zero-overhead,编译期反射效率远高于运行期反射。
那么,通过c++20的编译期反射我们能得到什么呢?我们可以得到很多很多关于类型和对象的元信息,主要有:获取对象类型或枚举类型的成员变量,成员函数的类型;获取类型和成员的名称;获取成员变量是静态的还是constexpr;获取方法是virtual、public、protect还是private;获取类型定义时的源代码所在的行和列。所以c++20的反射其实是提供了一些可以编译期向编译器查询目标类型“元数据”的api,下面来看看c++20的反射用法:
struct person{
int id;
std::string name;
};
using metaperson = reflexpr(person);
using members = std::reflect::get_data_members_t
using metax = std::reflect::get_data_members_t
constexpr bool is_public = std::reflect::is_public_v
using field0 = std::reflect::get_reflected_type_t
上面的例子中,c++20新增关键字reflexpr返回的是person的元数据类型,接下来我们就可以查询这个元数据类型了,std::reflect::getdatamembers_t返回的是对象成员的元数据序列,我们可以像访问tuple一样访问这个序列,得到某一个字段的元数据之后我们就可以获取它的具体信息了,比如它的具体类型是什么,它的字段名是什么,它是公有还是私有的等等。
注意:c++20的反射语法还没有最终确定,这只是一种候选的语法实现,还有一种没有元编程的语法版本,该版本通过编译期容器和字符串来存放元数据,比如constexpr std::vector,constexpr std::map,constexpr std::string等 ,这样就可以像普通的c++程序那样来操作元数据了,用起来可能更简单。
c++20的编译期反射实际上提供了一些编译期查询ast信息的接口,功能完备而强大。6.总结concepts让c++的模版程序的编写变得更简单和容易理解;ranges让我们使用stl容器和算法更加简单,并且更容易组合算法及延迟计算;modules帮助我们大大加快编译速度,同时弥补了c++使用库和缺乏包管理的缺陷;coroutines帮助我们简化异步程序的编写;reflection给我们提供强大的编译期ast元数据查询能力;......关于c++20的更多细节读者可以在这里查看:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/。
总而言之,c++的新标准都是为了让c++变得更简单、更完善、更强大、更易学和使用,这也是c++之父希望未来c++演进的一个方向和目标。
c++20,一言以蔽之:newer is better!
在此呼吁现在仍然还在使用着20年前的标准c++98的公司尽早升级到最新的标准,跟上时代的发展,新标准意味这生产力和质量的提升,越早使用越早享受其带来的好处!
几周前,c++标准委会历史上规模最大的一次会议(180人参会)在美国san diego召开,这次的会议上讨论确定哪些特性要加入到c++20中,哪些特性可能加入到c++20中。在明年二月份的会议当中将正式确定所有的c++20特性。http://yushuokj.51dzw.com
这次会议讨论的提案也是非常之多,达到了创纪录的274份,c++20的新特性如果要一一列出的话将是一份长长的清单,因此本文将只评论大部分确定要加入和可能加入到c++20的重要特性,让读者对c++的未来和演进趋势有一个基本的了解。文章原创 csdn:作者:祁宇,modern c++开源社区purecpp.org创始人
- 51电子网公益库存:
- CAT24C08YI-GT3
- CAT24C128LI-G
- CAT24C16C4ATR
- CAT24C16WI-GT3
- CBT3257ABQ,115
- CBTL04043A1EXJ
- CBTL1608A1UK,019
- CC2530F128RHAR
- CC2640F128RHBT
- CD40106BM96
- 2N5087G
- 2N7002
- 2N7002,215
- 2N7002ET1G
- 2SC3648T-TD-E
- 2SC5508-T2B-A
- 2V7002KT1G
- 2SC5508-T2B-A
- 2SK2313
- 2SC5508-T2B-A
c++20的重要特性:conceptsrangesmodulescoroutinesreflection接下来让我们慢慢揭开c++20的面纱,看看这些特性到底是什么样的,它们解决了什么问题。1.concepts在谈concepts之前我想先介绍一下concepts提出的背景和原因。众所周知,因为c++的模版和模版元具备非常强大的泛型抽象能力并且是zero overhead,所以模版在c++中备受推崇,大获成功,在各种c++库(如stl)中被广泛使用。
然而,模版编程还存在一些问题,比如有些模版的代码写起来比较困难,读起来比较难懂,尤其是编译出错的时候,那些糟糕的让人摸不着头脑的错误提示让人头疼。因此,c++之父bjarne stroustrup很早就希望对模版做一些改进,让c++的模版编程变得简单好写,错误提示更明确。他早在1987年就开始做这方面的尝试了。c++之父bjarne stroustrup具体思路就是给模版参数加一些约束,这些约束相比之前的写法具有更强的表达能力和可读性,会简化c++的泛型模版代码的编写。
所以concepts的出现主要是为了简化泛型编程,一个concept就是一个编译期判断,用于约束模版参数,concepts则是这些编译期判断的合集。下面通过一个例子来展示concepts是如何简化模版编程的。http://yushuollp.51dzw.com
比如有这样一个类b,我们调用它的成员函数tostring时,对t类型进行限定,即限定t类型是std::string的可转换类型,这样做的目的是为了更安全,能在编译期就能检查错误。这里通过c++14的std::enableif_t来对t进行限定,但是长长的enableift看起来比较冗长繁琐,头重脚轻。来看看用concepts怎么写这个代码的。
template
class b {
public:
template
typename std::enable_if_t
to_string() const {
return "class b<>";
}
};
b
std::cout << b1.to_string() << std::endl; // compile error!
b
std::cout << b2.to_string() << std::endl; // ok!
可以看到,requires castabletostring比之前长长的enableift要简洁不少,代码可读性也更好,castabletostring就是一个concept,一个限定t为能被转换为std::string类型的concept,通过requires相连接,语义上也更明确了,而且这个concept还可以复用。
concepts的这个语法也可能在最终的c++20中有少许不同,有可能还会变得更简洁,现在语法有几个候选版本,还没最终投票确定。2.ranges相比stl,ranges是更高一层的抽象,ranges对stl做了改进,它是stl的下一代。为什么说ranges是stl的未来?虽然stl在c++中提供的容器和算法备受推崇和广泛被使用,但stl一直存在两个问题:stl强制你必须传一个begin和end迭代器用来遍历一个容器;stl算法不方便组合在一起。stl必须传迭代器,这个迭代器仅仅是辅助你完成遍历序列的技术细节,和我们的函数功能无关,大部分时候我们需要的是一个range,代表的是一个比迭代器更高层的抽象。
那么ranges到底是什么呢?ranges是一个引用元素序列的对象,在概念上类似于一对迭代器。这意味着所有的stl容器都是ranges。在ranges里我们不再传迭代器了,而是传range。比如下面的代码:
stl写法:
std::vector
std::sort(v.begin(), v.end());
ranges写法:
std::sort(v);
stl有时候不方便将一些算法组合在一起,来看一个例子:
std::vector
std::vector
std::copy_if(v.begin(), v.end(), std::back_inserter(event_numbers), [](int i){ return i % 2 == 0;});
std::vector
std::transform(event_numbers.begin(), event_numbers.end(), std::back_inserter(event_numbers), [](int i){ return i * 2;});
for(int n : results){
std::cout<
}
//最终会输出 4 8
上面这个例子希望得到vector中的偶数乘以2的结果,需求很简单,但是用stl写起来还是有些冗长繁琐,中间还定义了两个临时变量。如果用ranges来实现这个需求,代码就会简单得多。
auto results = v | ranges::view::filter([](int i){ return i % 2 == 0; })
| ranges::view::transform([](int i){ return i * 2; });
用concetps我们可以很方便地将算法组合在一起,写法更简单,语义更清晰,并且还可以实现延迟计算避免了中间的临时变量,性能也会更好。http://yushuo1.51dzw.com
concepts从设计上改进了之前stl的两个问题,让我们的容器和算法变得更加简单好用,还容易组合。3.modules一直以来c++一直通过引用头文件方式使用库,而其他90年代以后的语言比如java、c#、go等语言都是通过import包的方式来使用库。现在c++决定改变这种情况了,在c++20中将引入modules,它和java、go等语言的包的概念是类似的,直接通过import包来使用库,再也看不到头文件了。
为什么c++20不再希望使用#include方式了?因为使用头文件方式存在不少问题,比如有include很多模版的头文件将大大增加编译时间,代码生成物也会变大。而且引用头文件方式不利于做一些c++库和组件的管理工具,尤其是对于一些云环境和分布式环境下不方便管理,c++一直缺一个包管理工具,这也是c++被吐槽得很多的地方,现在c++20 modules将改变这一切。
modules在程序中的结构如下图:上面的图中,每个方框表示一个翻译单元,存放在一个文件里并且可以被独立编译。每个module由module接口和实现组成,接口只有一份,实现可以有多份。
modules接口和实现的语法:
export module module_name;
module module_name;
使用modules:
import module_name;
modules允许你导出类,函数,变量,常量和模版等等。
接下来看一个使用modules的例子:
import std.vector; // #include
import std.string; // #include
import std.iostream; // #include
import std.iterator; // #include
int main() {
using namespace std;
vector
"socrates", "plato", "descartes", "kant", "bacon"
};
copy(begin(v), end(v), ostream_iterator
"));
}
可以看到不用再include了,直接去import需要用到的modules即可,是不是有种似曾相识的感觉呢。曾看到一个人说如果c++支持了modules他就会从java回归到c++,也说明这个特性也是非常受关注和期待的。4.coroutines很多语言提供了coroutine机制,因为coroutine可以大大简化异步网络程序的编写,现在c++20中也要加入协程了(乐观估计c++20加入,悲观估计在c++23中加入)。
如果不用协程,写一个异步的网络程序是不那么容易的,以boost.asio的异步网络编程为例,我们需要注意的地方很多,比如异步事件完成的回调函数中需要保证调用对象仍然存在,如何构建异步回调链条等等,代码比较复杂,而且出了问题也不容易调试。而协程给我们提供了对异步编程优雅而高效的抽象,让异步编程变得简单!
c++ courotines中增加了三个新的关键字:co_await,co_yield和co_return,如果一个函数体中有这三个关键字之一就变成coroutine了。http://yushuo.51dzw.com
co_await用来挂起和恢复一个协程,co_return用来返回协程的结果,co_yield返回一个值并且挂起协程。
下面来看看如何使用它们。
写一个lazy sequence:
generator
for (int current=start; current+= step)
co_yield current;
}
for(auto n : get_integers(0, 5)){
std::cout<
}
std::cout<<'
';
上面的例子每次调用get_integers,只返回一个整数,然后协程挂起,下次调用再返回一个整数,因此这个序列不是即时生成的,而是延迟生成的。
接下来再看一下co_wait是如何简化异步网络程序的编写的:
char data[1024];
for (;;)
{
std::size_t n = co_await socket.async_read_some(boost::asio::buffer(data), token);
co_await async_write(socket, boost::asio::buffer(data, n), token);
}
这个例子仅仅用了四行代码就完成了异步的echo,非常简洁!co_await会在异步读完成之前挂起协程,在异步完成之后恢复协程继续执行,执行到async_write时又会挂起协程直到异步写完成,异步写完成之后继续异步读,如此循环。如果不用协程代码会比较繁琐,需要像这样写:
void do_read()
{
auto self(shared_from_this());
socket_.async_read_some(boost::asio::buffer(data_, max_length),
[this, self](boost::system::error_code ec, std::size_t length)
{
if (!ec)
{
do_write(length);
}
});
}
void do_write(std::size_t length)
{
auto self(shared_from_this());http://yushuokj.51dzw.com
boost::asio::async_write(socket_, boost::asio::buffer(data_, length),
[this, self](boost::system::error_code ec, std::size_t /*length*/)
{
if (!ec)
{
do_read();
}
});
}
可以看到,不使用协程来写异步代码的话,需要构建异步的回调链,需要保持异步回调的安全性等等。而使用协程可以大大简化异步网络程序的编写。5.reflectionc++中一直缺少反射功能,其他很多语言如java、c#都具备运行期反射功能。反射可以用来做很多事情:比如做对象的序列化,把对象序列化为json、xml等格式,以及orm中的实体映射,还有rpc远程过程(方法)调用等,反射是应用程序中非常需要的基础功能。现在c++终于要提供反射功能了,c++20中可会将反射作为实验库,在c++23中正式加入到标准中。
在反射还没有进入到c++标准之前,有很多人做了一些编译期反射的库,比如purecpp社区开源的序列化引擎iguana,以及orm库ormpp,都是基于编译期反射实现的。然后,非语言层面支持的反射库存在种种不足之处,比如在实现上需要大量使用模版元和宏、不能访问私有成员等问题。
现在c++终于要提供完备地编译期反射功能了,为什么是编译期反射而不是像其它语言一样提供运行期反射,因为c++的一个重要设计哲学就是zero-overhead,编译期反射效率远高于运行期反射。
那么,通过c++20的编译期反射我们能得到什么呢?我们可以得到很多很多关于类型和对象的元信息,主要有:获取对象类型或枚举类型的成员变量,成员函数的类型;获取类型和成员的名称;获取成员变量是静态的还是constexpr;获取方法是virtual、public、protect还是private;获取类型定义时的源代码所在的行和列。所以c++20的反射其实是提供了一些可以编译期向编译器查询目标类型“元数据”的api,下面来看看c++20的反射用法:
struct person{
int id;
std::string name;
};
using metaperson = reflexpr(person);
using members = std::reflect::get_data_members_t
using metax = std::reflect::get_data_members_t
constexpr bool is_public = std::reflect::is_public_v
using field0 = std::reflect::get_reflected_type_t
上面的例子中,c++20新增关键字reflexpr返回的是person的元数据类型,接下来我们就可以查询这个元数据类型了,std::reflect::getdatamembers_t返回的是对象成员的元数据序列,我们可以像访问tuple一样访问这个序列,得到某一个字段的元数据之后我们就可以获取它的具体信息了,比如它的具体类型是什么,它的字段名是什么,它是公有还是私有的等等。
注意:c++20的反射语法还没有最终确定,这只是一种候选的语法实现,还有一种没有元编程的语法版本,该版本通过编译期容器和字符串来存放元数据,比如constexpr std::vector,constexpr std::map,constexpr std::string等 ,这样就可以像普通的c++程序那样来操作元数据了,用起来可能更简单。
c++20的编译期反射实际上提供了一些编译期查询ast信息的接口,功能完备而强大。6.总结concepts让c++的模版程序的编写变得更简单和容易理解;ranges让我们使用stl容器和算法更加简单,并且更容易组合算法及延迟计算;modules帮助我们大大加快编译速度,同时弥补了c++使用库和缺乏包管理的缺陷;coroutines帮助我们简化异步程序的编写;reflection给我们提供强大的编译期ast元数据查询能力;......关于c++20的更多细节读者可以在这里查看:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/。
总而言之,c++的新标准都是为了让c++变得更简单、更完善、更强大、更易学和使用,这也是c++之父希望未来c++演进的一个方向和目标。
c++20,一言以蔽之:newer is better!
在此呼吁现在仍然还在使用着20年前的标准c++98的公司尽早升级到最新的标准,跟上时代的发展,新标准意味这生产力和质量的提升,越早使用越早享受其带来的好处!
几周前,c++标准委会历史上规模最大的一次会议(180人参会)在美国san diego召开,这次的会议上讨论确定哪些特性要加入到c++20中,哪些特性可能加入到c++20中。在明年二月份的会议当中将正式确定所有的c++20特性。http://yushuokj.51dzw.com
这次会议讨论的提案也是非常之多,达到了创纪录的274份,c++20的新特性如果要一一列出的话将是一份长长的清单,因此本文将只评论大部分确定要加入和可能加入到c++20的重要特性,让读者对c++的未来和演进趋势有一个基本的了解。文章原创 csdn:作者:祁宇,modern c++开源社区purecpp.org创始人
上一篇:Angular 7 十大特性
下一篇:人脸识别技术企业 TOP榜
热门点击
- C++20
- 下一代量子互联网
- 集成电路发展历程及未来趋势
- Imagination:AI和GPU创新技术和产品
- 2019年十大“惊人预言”
- MOS管驱动电路详解
- “世界最具影响力十大华商人物”
- 三星发展7纳米至3纳米先进制程
- 2019年DevOps八大趋势
- NFC最全的芯片技术厂商和应用解读
推荐电子资讯
- 微软新专利:皮肤感应边框
- 该专利名为“基于抓握的装置适应(Grip-Based&... [详细]