首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++20新书推荐!

C++20支持协程、支持modules、可以using enum、引用约束和概念,且函数模板可以缩写 其中,最重要的四大概念分别是概念(concept)、范围 (ranges)、协程(coroutines...使用模板 进行通用编程的关键思想是定义能通过各种类型(type)使用的函数和类,但是在实例化模板时经常会出现用错类型的问题,其结果通常是几页难懂的报错信息。...概念改变这个问题,让编程者模板编写要求,而编译器则可以检查这个要求。...概念革新了思考和编写通用代码的方式,因为模板的要求是接口的一部分,类模板中的函数重载和特殊化可以基于概念进行,且编译器能够比较模板参数的要求与实际的模板参数,所以能得到更好的报错信息。...使用概念,编程者可以使用预定义的概念,也可以定义自己的概念C++20auto和概念的用法统一到了一起,可以不使用auto,而是使用概念

75010

C++20新特性简介-Concepts

由于这个模板函数已经可以用于整数和双精度数,错误的原因不在模板函数本身,而是在调用模板时使用实际数据Complex。但问题是错误信息并没有提示是哪个调用出的问题。...C++20新特性之Concept 很快就会正式发布的C++20引入了一个新特性-Concept。简单讲就是描述模板参数的特性和要求。...requires用来描述各种需求,它的参数有点像函数参数定义,参数的类型可以是模板参数(例如T),也可以是已经定义的其他类型。参数名obj的作用类似变量,会在需求描述中使用。...定义Concept之后,模板函数这样写: template T add(T in1, T in2) { return in1 + in2; } 唯一的变化就是typename...引入的Concept之后,同样的问题,显示的错误信息完全不同: 出错的位置从模板函数内部变成了调用模板函数的代码(58行)。软件规模变大之后,快速定位引发问题的位置特别重要。

1.3K10
您找到你想要的搜索结果了吗?
是的
没有找到

解读C++即将迎来的重大更新(一):C++20的四大新特性

C++20 的编译器支持 适应新特性的最简单方法是试用它们。那么接下来我们就面临着这个问题:哪些编译器支持 C++20 的哪些特性?...四大新特性 概念(concept) 使用模板进行通用编程的关键思想是定义能通过各种类型(type)使用的函数和类。但是,在实例化模板时经常会出现用错类型的问题,其结果通常是几页难懂的报错信息。...现在概念来了,这个问题可以休矣。概念让你能为模板编写要求,而编译器则可以检查这个要求。概念革新了我们思考和编写通用代码的方式。...原因如下: 模板的要求是接口的一部分; 类模板中的函数重载或特殊化可以基于概念进行; 因为编译器能够比较模板参数的要求与实际的模板参数,所以能得到更好的报错信息。 但是,这还不是全部。...我使用了这个缩写函数模板句法来定义 gcd。gcd 要求其参数和返回类型支持概念 Integral。gcd 是一类对参数和返回值都有要求的函数模板

1.4K20

未来已来:从SFINAE到concepts

参数x赋值给一个string类型的v,但是在main()函数中 ,调用fun()函数时候传入了1,这个编译器会推导int类型,那么把一个int类型赋值给string,编译器会报错。...,或者说把问题暴露在编译阶段,自C++20起引入了concepts。...横空出世 C++20 引入了概念(Concepts)这一新特性,它是一种用于约束模板类型参数的机制。...在前面的例子中,我们无非是通过各种方式来约束参数,使得满足某个条件的参数调用一个模板函数,而不满足的则使用另外一个模板函数。这种方式在C++20用的更为广泛,称之为约束模板参数。...约束模板参数 约束模板参数类型的写法与传统的目标函数很像,如下这个是传统的模板函数: template void fun() { } 此时,如果要限制模板参数整形,则可以像如下这样写

14210

探索 C++20:为什么我们应该拥抱这个时代?

C++20 引入了许多新特性和改进,旨在使 C++ 更具表现力、高效且易于使用。C++20 的一些最重要的特性包括: 概念(Concepts):使模板编程变得更加直观、可靠和易于使用。...constexpr lambdas: lambda 用作 constexpr 函数的能力,允许在更多上下文中使用 lambda 表达式,包括在常量表达式和模板参数中使用。...例如,C++20 引入了 std::format 库,字符串格式化提供了一个高性能的替代方案,用于替代 printf 和 sprintf。...此外,C++20 引入了 std::bit_cast 函数,提供了一种安全有效地执行类型转换的方式。...模块化编程: C++20 引入了模块化编程的支持,这是一种新的组织代码的方式,允许开发人员代码分割成逻辑上独立的模块。。

52310

C++雾中风景17:模板的非推断语境与std::type_identity

模板函数add在进行类型推断时出现了冲突,在同一个函数中,模板类型T被同时推断long与int。 我们来分析一下模板推断的流程。...接着,参数val的类型int, 它作为add函数的第二个参数传入,而此时由于13int类型,所以T被推导int类型。...正是因为这样,在add函数进行模板推导的过程之中,两个参数test与val同时参与了模板类型的推导,导致出现了上述的问题。...我们可以尝试add函数的调用改为如下:add(test_template, 10l)。此时val也作为参数T也被推导long类型,则编译不再报错。 3....利用非推断语境解决问题 显然,上面的代码我们希望编译器支持int类型自动推导long,而不要出现恼人的报错。

69230

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

C++20 的核心语言 之前的一篇博客概览式地介绍了 C++20概念、范围、协程和模块,下面开始介绍它的核心语言。 ? 三路比较运算符 三路比较运算符 通常被称为太空船运算符。...好吧,这确实经过了简化,详见:https://en.cppreference.com/w/cpp/language/aggregate_initialization 字符串文字作为模板参数C++...20 之前,你不能将字符串用作非类型的模板参数。...如果你通过复制 [=, this] 来显式地获取它,就不会收到 C++20 的弃用警告。 模板 lambda 你可能和我一样,最先想到的是:我们为什么需要模板 lambda?...你可以不使用类型参数,而是使用概念: auto foo = [](std::vector const& vec) { // do vector specific

1K10

C++20的四个模块新特性应用

C++20的四个模块新特性应用 I.新特性一览 [qhYdL8.png] 我想这一张图就足以说明大部分的C++20新特性 II.正文 图中浅蓝色的是本文要讲解的C++20的四个新特性 Moudules(...其中我认为很有用的是ranges的相关概念——管道操作符 下面是网络上的示例代码 // 使用管道操作符前 vector data { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; auto...Concepts(概念库) 它减小了对模板类型的限制,在项目构造过程中,我们可以不必考虑用语言特性对模板类作静态限制 我们不妨做一个对比: 在C++20之前,我们可以用如下方式对模板参数进行限制: type...T> void Func(T t) requires test_Concept; 还有许多限制的方法,此处不再一一列出 PS.标准库也提供一些concept Coroutines(协程) 协程是一个可以记住自身状态...,可随时挂起和执行的函数

70061

C++雾中风景17:模板的非推断语境与std::type_identity

模板函数add在进行类型推断时出现了冲突,在同一个函数中,模板类型T被同时推断long与int。 我们来分析一下模板推断的流程。...接着,参数val的类型int, 它作为add函数的第二个参数传入,而此时由于13int类型,所以T被推导int类型。...正是因为这样,在add函数进行模板推导的过程之中,两个参数test与val同时参与了模板类型的推导,导致出现了上述的问题。...我们可以尝试add函数的调用改为如下:add(test_template, 10l)。此时val也作为参数T也被推导long类型,则编译不再报错。 3....利用非推断语境解决问题 显然,上面的代码我们希望编译器支持int类型自动推导long,而不要出现恼人的报错。

1.1K10

C++ 实用指南

在 2020 年,C++20 已经准备就绪,并且这些重要特性随编译器一起提供!...不过,问题是你是否需要记住它? 一些不错的评论: c0r3ntin: 这很复杂,但不是每天都能遇到。这个值可以 address ?可以复制?可以移动?应该移动?...同样的情况发生在 C++20 中,我们迎来了一个重大且期待已久的改进:概念——它彻底改变了 C++。 然而,如果你想学习模板,一开始可能会不知所措。  ...ABI 随着新特性列表的不断增长,“从头开始”修复 C++ 设计中的旧问题可能是很诱人的主题。但这种语言的原则是不能破坏旧代码,所以委员会非常严格,不喜欢改变已引入特性的路线。...至于模板,它变得越来越容易使用。概念让代码更安全,没有像 SFINAE 这样的技巧。更重要的是,我们有了constexpr和auto,让泛型代码更简单了(几乎就像常规代码一样)。

50320

内联和嵌套命名空间

代码中会定义很多的类名、函数名、模板名,甚至一些全局变量,如果不对这些名称加以规范,很容易造成名字的冲突,因为默认情况下这些名字都是全局名字,这种情况也称之为命名空间污染。...为了避免这个问题,C++标准引入了命名空间的概念,将不同模块的名字限定在各自模块的命名空间中,命名空间中的名字的作用域只在命名空间内有效,尽可能地避免名字的冲突。...命名空间在C++98标准中已经引入,它的概念以及用法这里就不再赘述,现在来介绍的是现代C++标准新增的功能:内联命名空间(C++11)和嵌套命名空间(C++17),以及在C++20中的改进。...:A::C::foo();需要注意的是,inline关键字可以出现在除第一个namespace之外的任意namespace之前,上面的代码需要使用支持C++20标准的编译器来编译,在编译时加上参数-std...=c++20

11120

xmake v2.2.9 发布, 新增c++20 modules的实验性支持

这个版本没啥太大新特性,主要对c++20 modules进行了实验性支持,目前支持clang/msvc编译器,除此之外改进了不少使用体验,并且提高了一些稳定性。...另外,这个版本新增了socket.io支持以及对应协程io的调度支持下个版本的远程编译,以及后续的分布式编译做准备。...项目源码 官方文档 新特性介绍 c++20 modules c++ modules已经正式纳入了c++20草案,msvc和clang也已经基本实现了对modules-ts的支持,随着c++20的脚步离我们越来越近...: 改进hash.uuid并且实现uuid v4 #639: 改进参数解析器支持-jN风格传参 Bugs修复 #567: 修复序列化对象时候出现的内存溢出问题 #566: 修复安装远程依赖的链接顺序问题...#565: 修复vcpkg包的运行PATH设置问题 #597: 修复xmake require安装包时间过长问题 #634: 修复mode.coverage构建规则,并且改进flags检测

95210

C++20终于要来了…

在采访中,我们谈到了与 C++20 有关的几个问题。 ? 他说,“我现在很有信心,C++20 会非常出色。我经常提到,C++11 用起来就像是一种全新的语言。...第一个特性是概念(Concepts),它是对范式编程中接口的精确规范,旨在提升范式编程的易行性与灵活性。因此,我们看到更多的范式编程,代码呈现形式也将会有所变化。...大家会获得更好的错误提示信息,并且可以更少地使用模板元编程。当然,编译速度也会更快。 另一个重要新特性是模块(Modules)。...除此之外,C++20 的新特性还包括范围、概念与约束(Constraints and concepts)、指定初始化(designated initializers)、计时、并行算法和对并发编程的一些改进等等...当谈到对 C++20 的期望,Bjarne Stroustrup 称“C++20 将会非常棒!它有我之奋斗了几十年的特性。我期望很多特性能够快速被采用。

53220

【C++入门(一)】:详解C++语言的发展及其重要性

️什么是C++ C语言适合处理较小规模的程序,但对于复杂问题和大规模程序不太适合。为了解决这一问题,20世纪80年代提出了面向对象编程思想,并引入了支持面向对象的程序设计语言。...我们先来看下C++的历史版本: 阶段 内容 C with classes 类及派生类、公有和私有成员、类的构造和析构、友元、内联函数、赋值运算符 重载等 C++1.0 添加虚函数概念函数和运算符重载,...引用、常量等 C++2.0 更加完善支持面向对象,新增保护成员、多重继承、对象的初始化、抽象类、静 态成员以及const成员函数 C++3.0 进一步完善,引入模板,解决多重继承产生的二义性问题和相应构造和析构的处...,if和switch语句中的初始化器等 C++20 自C++11以来最大的发行版,引入了许多新的特性,比如:模块(Modules)、协 程(Coroutines)、范围(Ranges)、概念(Constraints...)等重大特性,还有对已有 特性的更新:比如Lambda支持模板、范围for支持初始化等 C++23 制定ing C++还在不断的向后发展。

11110

机器人CPP编程基础-03变量类型Variables Types

Unicode 支持:C++14引入了更全面的 Unicode 支持,包括新的字符类型和函数。...C++20引入了一些新的变量类型和功能,进一步扩展了语言的表达力和性能。以下是一些C++20中引入的新变量类型和功能: 概念(Concepts):概念是一种用于指定类型必须满足的条件的语言特性。...可以使用概念来约束模板参数的类型,以便在模板实例化时确保类型符合特定的要求。这有助于提高代码的可读性和可维护性。...模板别名(Template Aliases):C++20引入了模板别名,允许使用别名来简化模板的声明和使用。...概念工具(Concept Tools):C++20提供了一组工具,用于定义和操作概念。这有助于提高代码的可读性和可维护性。 这些是C++20引入的一些主要变量类型和功能。

15620

C++20初体验——concepts

如果我们自己写的模板函数对类型有要求,可以在模板参数列表中写出: #include template void...有些资料中的标准库concept是帕斯卡命名(PascalCase)的,因为最初的concept提案中是这样写的,原因可能是为了让它看起来属于新的C++20,或是与模板参数列表中类型大写的习惯一致。...把T插到Concept1的参数列表的最前面,这里空,所以就是Concept1。...如果模板参数代入时出现了不存在的类型或变量,该约束仅仅是不被满足,而不会产生编译错误。 约束可以用于函数模板、类模板和成员函数,非模板类的非模板成员函数除外。...函数模板与类模板的约束是类似的,只有满足约束时模板才能实例化;对于成员函数的约束,如果它作用于模板类的模板参数,当约束不满足时,并不是类模板不能被实例化,而是实例化后的模板类没有这个成员函数: #include

1.3K10

C++20新特性个人总结

2.28  隐式地返回的本地变量转换为右值引用  2.29  允许default修饰运算符按值比较  2.30  非类型模板参数等效的条件  3  宏  4  属性  4.1  likely和unlikely...之后,对模板类型参数的约束可以细致到类型成员变量、类型成员函数甚至其返回值等等。 ...  从新版开始,lambda表达式支持模板编程,且支持自动推导。...  因为模板参数是处于编译期计算的,因此,作为调用用于自定义类型的模板参数的成员函数时,这些成员必须是constexpr修饰的。 ...    friend bool operator==(C, C) = default; // C++20支持 };  2.30  非类型模板参数等效的条件  相同类型的两个值,模板参数等效的条件(之一

1.9K50
领券