C++20
文章平均质量分 85
大树青云
历史不会简单的重复,但历史会惊人的相似
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
std::ranges::views::drop 和 std::ranges::drop_view
和是 C++20 引入的范围适配器,用于创建一个跳过前 N 个元素的新视图。原创 2025-05-19 15:17:55 · 1011 阅读 · 0 评论 -
省略不必要的拷贝Copy Elision
从C++发展历史看来,c++ 17引入了一个规则,要求在满足一定的条件下避免对象的复制,这在以前是可选的。C++17中一个叫做强制复制省略的技术就是基于这个观点的。至少包括以下两项内容:1. 返回值优化(RVO),即通过将返回值所占空间的分配地点从被调用端转移至调用端的手段来避免拷贝操作。返回值优化包括具名返回值优化(NRVO)与无名返回值优化(URVO),两者的区别在于返回值是具名的...原创 2019-08-30 16:54:18 · 5564 阅读 · 0 评论 -
Structured Bindings结构化绑定
结构化绑定允许通过对象的元素或成员初始化多个实体。例如,假设你定义了一个结构体包含两个成员:struct MyStruct{{ int i = 0; std::string s;};MyStruct ms;可以使用以下声明将该结构的成员直接绑定到新名称:auto [u,v] = ms;这里,u和v的名称就是所谓的结构化绑定。结构化绑定对于返...原创 2019-08-25 21:49:12 · 7696 阅读 · 3 评论 -
C++20 指定初始化器
对于聚合,C++20 提供了一种方法来指定应该用传递的初始值初始化哪个成员,但只能使用它。与编程语言C 相比,指定初始化器遵循成员顺序的限制,可以用于所有参数,也可以不用于参。仍然有一些类型不能用括号初始化,但可以用花括号初始化: 作用域枚举(枚举类类型)。• 括号初始化和括号初始化应尽可能相似,但也应尽可能不同,以符合现有的括号列表和括号。最后,若对具有右值引用成员的聚合使用圆括号进行初始化,则初始值的生存期不会延长,所。由于这些复杂的规则和陷阱,只有在必要时才应该使用带圆括号的聚合初始化,比如在使用。原创 2025-03-16 20:32:04 · 843 阅读 · 0 评论 -
C++之聚合类扩展(C++17/20)
在c++中初始化对象的一种方法是聚合初始化,它允许使用花括号从多个值初始化:struct Data{ std::string name; double value;};Data x{"test1", 6.778};在c++ 17中聚合可以有基类,所以对于从其他类/结构派生的结构,允许初始化列表:struct MoreData : Data{ ...原创 2019-08-29 15:03:07 · 997 阅读 · 1 评论 -
C++之lambda表达式详解
1. lambda基本语法2. lambda的使用(cosnt属性)3.lambda的陷阱原创 2019-12-12 20:17:50 · 366 阅读 · 0 评论 -
std::span
std::span原创 2025-03-14 22:07:28 · 411 阅读 · 0 评论 -
Operator <=> (spaceship operator)
operator <=>原创 2025-03-13 23:11:02 · 1136 阅读 · 0 评论 -
std::ranges::views::reverse, std::ranges::reverse_view
std::ranges::views::reversestd::ranges::reverse_view原创 2025-03-12 23:02:41 · 429 阅读 · 0 评论 -
std::ranges::views::common, std::ranges::common_view
std::ranges::views::common, std::ranges::common_view原创 2025-03-12 22:32:25 · 326 阅读 · 0 评论 -
std::ranges::views::split, lazy_split, std::ranges::split_view, lazy_split_view
std::ranges::views::splitstd::ranges::split_viewstd::ranges::views::lazy_splitstd::ranges::lazy_split_view原创 2025-03-12 21:54:54 · 1026 阅读 · 0 评论 -
std::ranges::views::keys, values, elements std::ranges::keys_view, values_view, elements_view
std::ranges::views::keysstd::ranges::keys_viewstd::ranges::views::valuesstd::ranges::values_viewstd::ranges::views::elementsstd::ranges::elements_view原创 2025-03-11 22:09:23 · 823 阅读 · 0 评论 -
std::ranges::views::take, take_while,std::ranges::take_view,take_while_view
范围适配器闭包对象(Range Adaptor Closure Object),可通过管道操作符。,可以高效处理范围的前 N 个元素,是函数式编程风格的典型工具。根据谓词(Predicate)截取原范围中满足条件的元素,一旦遇到不满足条件的元素,立即停止遍历,后续元素不再检查。若范围在遍历过程中被修改,可能导致未定义行为。是C++20 引入的范围库中的组件,用于。若原范围元素少于 N 个,则取整个范围。若所有元素都满足条件,则包含整个范围。一个范围适配器,生成原范围的。不保留后续满足条件的元素。原创 2025-03-10 22:09:31 · 637 阅读 · 0 评论 -
std::ranges::views::join,std::ranges::views::join_with
std::ranges::views::joinstd::ranges::views::join_with原创 2025-02-27 10:07:08 · 744 阅读 · 0 评论 -
std::ranges::views::filter
C++20 引入的视图适配器,用于根据谓词条件惰性过滤范围内的元素。通过捕获变量,可动态调整过滤条件对象为自定义结构体或类。:支持 Lambda、函数对象或成员函数。:迭代器类别继承自原始范围,可能影响性能。:惰性求值,不存储结果,适用于流式处理。视图可反向遍历(需注意效率)。:立即执行并将结果保存到容器中。生成仅包含满足条件元素的视图。:仅在遍历时计算,节省内存。链式组合多个视图适配器。:可与其他视图适配器(如。若原始范围支持双向迭代,原创 2025-02-27 09:16:01 · 870 阅读 · 0 评论 -
std::ranges::ref_view,std::ranges::owning_view, std::ranges::views::all
std::ranges::ref_viewstd::ranges::owning_view std::ranges::views::all原创 2025-02-26 22:09:45 · 1043 阅读 · 0 评论 -
std::ranges::copy, copy_if, copy_n, copy_backward, replace_copy, replace_copy_if, reverse_copy
std::ranges::copystd::ranges::copy_ifstd::ranges::copy_nstd::ranges::copy_backwardstd::ranges::replace_copystd::ranges::replace_copy_ifstd::ranges::reverse_copystd::ranges::rotate_copystd::ranges::unique_copy原创 2025-02-21 19:48:40 · 886 阅读 · 0 评论 -
std::ranges::remove, std::ranges::remove_if, std::ranges::remove_copy, std::ranges::remove_copy_if
std::ranges::removestd::ranges::remove_ifstd::ranges::remove_copystd::ranges::remove_copy_if原创 2025-02-19 11:22:46 · 1151 阅读 · 0 评论 -
container::erase
std::map::erasestd::set::erasestd::multimap::erasestd::multiset::erasestd::unordered_map::erasestd::unordered_set::erasestd::unordered_multimap::erasestd::unordered_multiset::erasestd::string::erase C++23vector::erase deque::eraselist::erase原创 2025-02-17 22:04:09 · 300 阅读 · 0 评论 -
std::ranges::merge std::merge std::inplace_merge
std::ranges::mergestd::mergestd::mapstd::setstd::multimapstd::multisetstd::unordered_mapstd::unordered_setstd::unordered_multimapstd::unordered_multiset原创 2025-02-17 21:33:27 · 924 阅读 · 0 评论 -
ranges::find find_if find_if_not find_first_of find_last find_last_if find_last_if_not find_end adja
std::ranges::std::find std::ranges::find_ifstd::ranges::find_if_notstd::ranges::find_first_ofstd::ranges::find_laststd::ranges::find_last_ifstd::ranges::find_last_if_notstd::ranges::find_endstd::ranges::adjacent_find原创 2025-02-17 11:30:08 · 986 阅读 · 0 评论 -
ranges::set_intersection set_union set_difference set_symmetric_difference
ranges::set_intersection ranges::set_union ranges::set_difference ranges::set_symmetric_difference原创 2025-02-16 09:51:59 · 815 阅读 · 0 评论 -
set_intersection set_union set_difference set_symmetric_difference
std::set_intersection std::set_union std::set_difference std::set_symmetric_difference原创 2025-02-15 16:57:45 · 1136 阅读 · 0 评论 -
std::find, find_if, find_if_not,find_end,find_first_of,adjacent_find
std::findstd::find_ifstd::find_if_notstd::find_endstd::find_first_ofstd::adjacent_find原创 2025-02-15 16:02:01 · 1069 阅读 · 0 评论 -
std::includes search search_n binary_search mismatch lower_bound upper_bound equal_range
std::includes std::search std::search_n binary_search std::mismatch std::lower_bound std::upper_bound std::equal_range原创 2025-02-15 14:40:12 · 747 阅读 · 0 评论 -
std::ranges::includes search search_n binary_search mismatch lower_bound upper_bound equal_range
std::ranges::includes std::ranges::search std::ranges::search_n std::ranges::binary_search std::ranges::mismatch std::ranges::lower_bound std::ranges::upper_bound std::ranges::equal_range原创 2025-01-21 18:10:34 · 901 阅读 · 0 评论 -
C++20 标准概念
类型和对象基本概念”表列出了类型和对象的基本概念。“范围、迭代器和算法概念”表列出了范围、视图、迭代器和算法的概念。“辅助概念”表列出的概念主要用作其他概念的构建块,通常不会让应用程序开发者直接使用。标准概念在不同的头文件中定义:• 头文件<concepts> 中定义了许多基本概念,其中包括<ranges> 和<iterator>。• 迭代器的概念在头文件<iterator> 中定义。• 范围的概念在头文件<ranges> 中定义。原创 2024-12-12 10:48:46 · 1088 阅读 · 0 评论 -
constinit consteval and C++23 if consteval
本章介绍了几个扩展C++以支持编译时计算的方法。本章的一部分是两个新关键字constinit和consteval,以及允许程序员在编译时使用堆内存、向量和字符串的扩展功能。C++20引入了一个新的关键字constinit。它可以用于强制和确保可变的静态或全局变量在编译时初始化。简单来说,效果可以描述为:constinit变量并不是const(这个关键字更好地被命名为), 即可被修改值。其命名来源于通常在初始化编译时常量时发生初始化的事实。可以在声明静态或全局变量时使用constinit。原创 2024-12-11 22:31:28 · 1330 阅读 · 0 评论 -
operator <=> (spaceship operator)
= 与!= 操作符为了检查是否相等,现在定义== 操作符就够了。当编译器找不到表达式的匹配声明a!=b 时,编译器会重写表达式并查找!(a==b)。若这不起作用,编译器也会尝试改变操作数的顺序,所以也会尝试!(b==a):a!=b,!(b==a)因此,对于TypeA 的a 和TypeB 的b,编译器将能够识别并编译a!= b若需要的话,可以这样做• 一个独立函数operator!• 一个独立函数operator==(TypeA, TypeB)原创 2024-05-28 09:25:21 · 1449 阅读 · 0 评论 -
结构化绑定
为了解决这类问题,C++20标准规定结构化绑定的限制不再强调必须为公开数据成员,编译器会根据当前操作的上下文来判断是否允许结构化绑定。幸运的是,虽然标准是2018年提出修改的,但在我实验的3种编译器上,无论是C++17还是C++20标准,以上代码都可以顺利地通过编译。当在结构体或者类中使用结构化绑定的时候,需要有公开的访问权限,否则会导致编译失败。在上面这段代码中,foo是结构体A的友元函数,它可以访问A的私有成员i。在C++20之前,lambda不能直接捕获结构化绑定的变量的。原创 2024-05-25 16:26:55 · 369 阅读 · 0 评论 -
Down with typename
• 当指定static_cast、const_cast、reinterpret_cast 或dynamic_cast 的目标类型时。• 在别名声明中(即,使用using 声明类型名称时); 注意,带typedef 的类型声明仍然需要typename。• 当定义或声明函数的返回类型时(除非声明发生在函数或块范围内)• 在require 表达式中声明参数类型时。• 为模板的类型参数声明默认值时。• 声明非类型模板形参的类型时。• 在类声明中使用类型成员时。– 声明成员函数的返回类型时。• 声明尾步返回类型时。原创 2024-05-25 16:14:47 · 387 阅读 · 0 评论 -
using 用于枚举值
只要在print() 的作用域中没有声明其他名为open、progress 或done 的符号,这段代码就可以正。也可以对无作用域的枚举类型使用using 声明。这不是必需的,但就不必知道枚举类型是如何。对于公开的枚举值,甚至依赖于参数的查找(ADL) 也可以正常工作。可以将上面的例子扩展为。然而,在某些明显没有冲突的上下文中,一直限定每个值可能会变得有点乏味。使用作用域枚举类型,现在可以使用using 枚举声明。使用枚举声明还可以将枚举值委托给不同的作用域。2. 枚举类型委托给不同的作用域。原创 2024-05-25 16:09:46 · 497 阅读 · 0 评论 -
普通函数的参数中的auto
尽管您可以在类定义中实现C2::foo(),但您无法实现C1::foo(),因为为了检查c2.print()的调用是否有效,编译器需要C2类的定义。在上述代码中,当C1的foo()函数调用c2.print()时,由于C2类的定义仍然是不完整的,编译器无法确定该调用的有效性。因此,这将导致编译错误。请注意,使用auto允许调用者传递任意类型的参数,只要该类型提供一个名为print()的成员函数。难以理解:对于复杂的函数或涉及多个参数的函数,使用auto作为参数类型可能会增加代码的复杂性和难以理解的程度。原创 2024-05-25 11:22:13 · 797 阅读 · 0 评论 -
range-based for loop
C++11标准引入了基于范围的for循环特性,该特性隐藏了迭代器的初始化和更新过程,让程序员只需要关心遍历对象本身,其语法也基于范围的for循环不需要初始化语句、条件表达式以及更新表达式,取而代之的是一个范围声明和一个范围表达式。其中范围声明是一个变量的声明,其类型是范围表达式中元素的类型或者元素类型的引用。而范围表达式可以是数组或对象,对象必须满足以下2个条件中的任意一个。1.对象类型定义了begin和end成员函数。2. 定义了以对象参数为类型的begin和end普通函数。原创 2024-05-25 11:13:12 · 1337 阅读 · 0 评论 -
6 ranges and views
自第一个C++ 标准以来,处理容器和其他序列元素的方法一直是使用迭代器,来确定第一个元素的位置(开始) 和最后一个元素后面的位置(结束)。对范围进行操作的算法通常使用两个参数来处理容器的所有元素,容器提供了begin() 和end() 等函数来提供这些参数。C++20 提供了一种处理范围的新方法,支持将范围和子范围定义和使用为单个对象,例如:将其作为一个整体作为单个参数传递,而不是处理两个迭代器。这种改变听起来很简单,会产生很多后果。原创 2024-05-25 09:06:39 · 333 阅读 · 0 评论 -
C++20之concept 和 require
可能要不止一次地需要指针约束,所以可以为约束引入一个概念。原创 2023-10-24 17:49:05 · 531 阅读 · 1 评论 -
四大特性模块(module)
C++20四大特性值模块(module)原创 2023-10-22 09:00:15 · 3497 阅读 · 0 评论 -
协程的介绍
先占位。原创 2023-10-22 08:00:23 · 220 阅读 · 0 评论 -
有状态lambda和无状态lambda
有状态、无状态 lambda原创 2023-02-05 22:23:45 · 650 阅读 · 0 评论
分享