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

C++ std::optional完全解读

C++17提供std::optional来解决这类问题,我们可以将optional看作是T类型和bool的一个打包。...class U > constexpr optional( optional&& other ); //C++20 起 (条件性 explicit) /*构造一个包含的对象,如同从参数 std...Args > constexpr explicit optional( std::in_place_t, Args&&... args ); //C++17 起 /*构造一个包含 的对象,如同从参数...将可选参数传递到函数。 使用示例 函数返回 std::optional 如果从函数返回可选值,则仅 std::nullopt 返回或计算值非常方便。...当我们需要一个具有延迟初始化的对象、或者用来表达value或no value的时候,我们可以使用std::optional来将使用其类型提高抽象的级别,使其他人更加容易理解我们大代码在做什么,因为声明

66231

C++23编程新特性

(可选) consteval 复合语句 else 语句 C++17新增基于编译和运行时条件,C++23在此基础上又做了提升,新增特性支持明显语境下可以进行求值。...C++23开始,满足条件的函数this可以被显示传参,但使用过程依旧需要遵循如下规范: 作为函数参数时需要是函数的首个形参 作用于lambda表达式时作为首个形参 不能在const、static关键字修复的函数中使用...\n"; 7、标记不可到达代码std::unreachable() 该特性用来标记不可能执行到的代码,类似于swich的default,实际上,这个特性用在这里也比较合适,但唯一不足的是,如果用了此标记实际又触发了这个代码...9、std::move_only_function 这个新增的包装器被定义头文件,该包装器可以调用或者存储任何一个可以被存储并调用任何可构造或者调用的函数。...int main() { static_assert(std::byteswap('b') == 'b'); } 对于C++23新增特性很多编译器已经都能够进行支持,当然C++23版本规划的内容也不止上面说的这些

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

C++ 中文周刊 第97期

const& c : v | std::views::chunk(3)) { print(c); } /* [1,2,3] [4,5,6] [7,8] */ chunk_by类似chunk,能提供一个谓词判断...这个讲的就是这个博客的内容,如何优化binary search,简单来说是SIMD,说实话SIMD我不太懂。...Aliasing: Risks, Opportunities and Techniques - Roi Barkan - C++ on Sea 2022 这里的aliasing表述的是多个指针使用指向同一个对象的情况...,比如滥用引用,比如自己给自己赋值,之前也提到过误用引用导致错误而引入decay_copy以及c++23的auto,本质上这种问题还是指针的歧义,导致编译器保守,没有彻底优化 来个代码 void byRef...dst, auto src, auto size) { copy_n(src, size, dst); }); return 0; } loopcpy这种明显无法区分src dst相同的副作用 比如

49230

C++那些事之string那些事

头文件,std::basic_string类是一个模板类,为各种字符串类型提供特化,包括常见字符串的std::string(即std::basic_string)和宽字符串的std::wstring...此外,引入了新的固定宽度字符串类型,如std::u32string和std::u16string,为处理Unicode字符提供更好的支持。...++17,引入了头文件,提供一种轻量级的只读替代方案,用于使用头文件的字符串类型。...,printString函数以std::string_view作为参数,这使得这个函数非常轻量级和灵活,因为没有制作任何字符串的副本,这个函数可以通过传递C和C++样式的字符串以各种方式使用。...; // 隐式转换为std::string_view return 0; } C++23 C++23引入了contains,用于检查字符串是否包含指定的子字符串。

25110

C++ 中文周刊 第109期

另外去掉了c++03支持,现在是2023 文章 Most C++ constructors should be explicit 尽可能的用explicit,除了以下场景 复制构造A(const A&...(To Be))](https://cppsenioreas.wordpress.com/2023/04/10/explicitto-be-to-be/) 这个讲的是这个语法 class integer...感觉很厉害 MLIR源码分析(一):基本数据结构 MLIR走读 今年在C/C++踩得最意外的一个坑 自己用数组做内存池,然后重载new aligned_malloc,结果地址并没有aligned,原因...,数组没对齐 C++ RTTI和LLVM RTTI使用方法和原理解析 打通游戏服务端框架的C++20协程改造的最后一环 已有库上拓展c++20协程玩法,代码演进上的一些设计 分析RTTI...Vectors and unique pointers 使用unique_ptr和vector会遇到个坑爹的问题,从initializer_list 构造的没法move,坑爹initializer_list C+

36920

C++ 动态新闻推送 第17期

now-available/ 文章 C++ folly库解读(二) small_vector —— 小数据集下的std::vector替代方案 介绍small_vector, small_vector有很多实现,算是一个小对象优化...c++ tip of week 230 Did you know that C++23 added if consteval?...代码在这里 Notes: brpc DoublyBufferedData 介绍brpc的小组件,brpc的小技巧很多,文档也很详细,值得一看 开源数据库OceanBase代码导读 和代码相关的不多,这个建议攒一起看...p/381020426 The Unfair Mutex 用原子量自旋来实现的mutex,代码在这里 TODO: 阅读 Futexes Are Tricky Template Arguments 介绍模版参数的一些场景...duckdb数据结构设计的,有点意思 LevelDB: Write Path leveldb写路径代码走读 视频 C++ Weekly - Ep 276 - C++20’s Conditionally explicit

42820

C++11『基础新特性』

类支持迭代器,自然也就支持范围 for 这个新特性,可以试着用一下 格局打开,其他类只需重载一个类型为 initializer_list 的参数,并在其中通过 initializer_list... 对象的迭代器进行数据遍历,就能轻松获取 initializer_list 对象的数据,所以 C++11 ,几乎对所有库的容器进行了更新:新增参数类型为 initializer_list... 对象赋值给容器对象的 2.3.高效的玩法 为什么说 列表初始化 是个好东西呢?...进行了重新设计,使其摇身一变,成为一个非常好用且实用的关键字:根据待赋给变量的参数,自动推导其参数类型,用户无需关心该变量要定义为什么类型 这就好比看见张三就知道这是一个人,不用带着人的概念去见张三...不能作为参数类型 3.2.decltype 获取推导类型 除了 auto 这个自动挡外,C++11 还提供另一个自动挡 decltype,不过这个自动挡使用起来比较麻烦,需要指明参数,才能推导出类型

21940

两万字长文,史上最全 C++ 年度总结!

用到的新特性: 显式对象参数和显式对象成员函数 但光看着像是不够的。C++ 这个名字就意味着,凡事都要做到更好,不单是和 C 相比。...所以基本可以判断 asio::string_view 这个组件 asio 是不对外提供的,只在库内部使用,作为 C++ 标准不够高时的备选。...(3)std modules std modules 是 C++23 的一个重要特性。由于疫情导致产出下降的 C++23 ,std modules 可能是其中最亮眼的特性。...而没有 Executors 提案提供的调度器接口的话,异步协程组件自然也无法开始设计。所以目前 C++23 存在的协程组件只包含和异步无关的同步 std::generator。...这个模型可以完整描述三个核心的要素:执行什么任务,在哪里执行以及如何调度。

1.5K30

C++ explicit关键字详解

C++编码时,可以通过构造函数将相应的数据类型转换成为C++类的对象,从某种程度来说给编码带来了方便,但并不是每次都正确,为了避免这种情况,C++提供explicit关键字,相对于implicit而言...(m_pStr) { delete m_pStr; m_pStr = nullptr; } } }; 如上的代码实例化类的对象时以下方法都是正确的...,以CString str5=6为例,在对对象进行实例化的过程主要进行了如下操作: CString string5(6); //或者如下所示 CString temp(6); CString...string5 = temp; 2 显示转换 构造函数上使用了explicit关键字后,通过构造函数进行对象实例化时需要进行显示类型转化。...关键字可以防止构造函数进行隐式自动转换 3 再次拆解 explicit关键字只对构造函数有一个参数的形式有效,如果构造函数有多个参数explicit的功能也将失效,但是C++也提供一种例外,既如果构造函数的其他参数都有默认值及时参数个数大于

1.3K20

C++ 动态新闻推送 第3期

https://godbolt.org/z/jG7x5h 解释编译器如何分析逃逸,以及这种场景下,无法RVO优化,所以RVO的汇编反而比禁止的要好 也解释什么gcc和clang效果不同 -> g...++ (x)默认表示禁止RVO,这是一个坑 SO 这篇文章还列了相关的提案,以及自己的建议PATCH,非常建议阅读,对于语言律师识别坑有帮助 Concise Result Extraction in...return (0 + ... + values); } c++ tip of week 215 C++2X Pattern Matching 类似rust的模式匹配语法,很有意思 应该c+...run() -> int { return singleton::get().call(); } }; class app_di { public: constexpr explicit...*p; } 同理,std::shared_mutex对应一个shared_guarded,封装好的类有更好的编译器检查, 如果直接用的mutex,mutex和data的对应关系不明显,可能需要编译器提供

29620

类和对象(下)

,以免造成一些程序上的错误 1.3 explicit关键字 explicit关键字有什么用呢?...静态成员也是类的成员,受public、protected、private 访问限定符的限制 3 友元 友元提供一种突破封装的方式,有时提供便利。...为什么会这样? 因为,默认的第一个参数是this,而a调用这个重载的函数,那么,第一个参数就是a的指针,this指针默认是第一个参数也就是左操作数了。...但是实际使用cout需要是第一个形参对象,才能正常使用。那么,我们只能将函数定义类外,如果是定义类外,没有this,又有个问题,那就是,如何获取类的成员变量? 友元函数解决这个问题。...6.拷贝对象时的一些编译器优化 传参和传返回值的过程,一般编译器会做一些优化,减少对象的拷贝,这个一些场景下还是非常有用的。

27320

返回类型引用(ref-qualified)的C++成员函数暗示什么

一、引子:返回引用类型的成员函数是 暗示使用它的this指针是左值还是右值。反过来说,如果一个成员函数不返回引用类型,那么对this指针是左值还是右值都是调用同一个函数。...3.1、只对右值形参操作一种场景是上面这个例子,防止用户错误地将一个暂存值传入给函数,然后期盼这个函数做出修改。(换句话说,只允许成员函数操作右值形参。...这个情况这个函数应该被修饰为 &&-qualified)。比如说这个函数会从对象object取到资源resources,然后处于未指定的状态。...有时候一个成员函数需要有能力从类取到资源,那么他就能被右值rvalue call到,否则,它就是const修饰的成员函数。...可以看std::optional::value这个例子。----四、未来C++23 C++23 有显式的对象, 因为用户可以forward上次的references.

17820

C++ 动态新闻推送 第47期

注意这个test,外面有->访问,里面有 = 访问,谁先谁后呢?c++17约定调用顺序,所以升级c++17就解决,保证外面的先里面的后 那c++17 之前,怎么解决?...,忘记的可以再看看 folly学习(一):C++如何实现一个通用迭代器 folly学习(二):如何实现一个declval 介绍folly小组件 Bare Metal C++ Register Access...Three C++23 features for common use 介绍三个比较常用的c++23特性 Literal suffixes for size_t uz 直接200uz,-1z,比size_t...Roi Barkan - Argument Passing, Core Guidelines and Aliasing - Meeting C++ 2021 这个咱们之前好像讲过,ppt在这里 小对象尽量传值别用引用指针...,记住第一个地址和对象大小/偏移,来自己定位。

24120

【C++类和对象】初始化列表与隐式类型转换

虽然上述构造函数调用之后,对象已经有一个初始值,但是不能将其称为对对象成员变量的初始化,构造函数体的语句只能将其称为赋初值,而不能称作初始化。...1.2初始化列表原因 C++类和对象中有些成员变量必须定义的时候初始化,这时候如果只是简单的使用构造函数来赋值是不可行的,所以C++引入了初始化列表这个概念; 类包含以下成员,必须放在初始化列表位置进行初始化...使用explicit关键字可以禁止隐式转换,并要求使用显式的类型转换。 2.2隐式类型转换 我们先来了解一下什么是隐式类型转换?...2.3explicit关键字使用 构造函数不仅可以构造与初始化对象,对于接收单个参数的构造函数,还具有类型转换的作用。...隐式类型转换某些情况下可以方便地进行类型转换,但有时也会导致意外的结果或者不可预测的行为,所以C++提供explicit来禁止隐式类型转换。

10210

类和对象(下)

即这样就正确。那这个又和explicit什么关联呢?...那么这个什么作用呢?...友元 在上一章节已经大致介绍友元的作用,因此在这里回顾并介绍注意事项 友元提供一种突破封装的方式,有时提供便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。...因为cout的输出流对象和隐含的this指针抢占第一个参数的位置。this指针默认是第一个参数也就是左操作数了。但是实际使用cout需要是第一个形参对象,才能正常使用。...经过2之后,计算机中就有一个洗衣机类,但是洗衣机类只是站在计算机的角度对洗衣机对象进行描述的,通过洗衣机类,可以实例化出一个个具体的洗衣机对象,此时计算机才能洗衣机是什么东西。

35200

C++之面向对象(下)

前言 本文继续介绍与C++与面向对象相关的内容,介绍构造函数的初始化列表、隐式类型转换、类的静态成员、友元、内部类、匿名对象以及编译器对拷贝构造的优化等概念。...那么对象什么时候进行初始化的呢? 2.初始化列表 初始化对象是由初始化列表完成的。...三、友元 友元提供一种突破封装的方式,有时可以提供便利。但是友元会增加耦合度,破坏了封装,所有友元不宜多用。 1.分类分类 友元分为友元函数和友元类。...因为cout的输出流对象和隐含的this指针抢占第一个参数的位置。this指针默认是第一个参数也就是左操作数了。但是实际使用只有cout是第一个形参对象时,才能正常使用。...传参和传返回值的过程,一般编译器会做一些优化,减少对象的拷贝,这个一些场景下还是非常有用的。

37540

【细品C++】类和对象的一些细节(初始化列表、友元、static成员等)

那么一个类对象真正的定义初始化是什么时候的呢?就在接下来提到的初始化列表当中。...const int _a; }; 除此之外,在上一篇文章,我提到过内置类型成员声明时可以给默认值,这个默认值相当于与函数的缺省参数,只不过上一篇没讲初始化列表,我没提。...隐式类型转换的构造与explicit关键字 构造函数不仅可以构造与初始化,对于单个参数或者除第一个参数无默认值其余均有默认值的构造函数,还具有类型转换的作用。...//大佬设计想的用法 const static int N = 10; int a[N]; 友元 友元提供一种突破封装的方式,有时提供便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。...但是因为cout的输出流对象和隐含的this指针抢占第一个参数的位置。this指针默认是类成员函数的第一个参数,也就是<<左操作数固定为date类对象

40620
领券