• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2024-06-29 23:34 Aet 隐藏边栏 |   抢沙发  3 
文章评分 1 次,平均分 5.0

结构化绑定

  1. 结构化绑定允许我们解构和绑定返回的元组、数组或结构体中的值,使得代码更加简洁和可读

嵌套命名空间

  1. C++17 允许使用嵌套命名空间声明的简写方式,减少冗长的代码

std::filesystem

  1. 跨平台文件系统操作

std::variant

  1. std::variant 是一个类型安全的联合体,允许存储多个类型中的一种

std::variantstd::visit

  1. 类型安全的联合体与访问器

std::any

  1. std::any 可以存储任何类型的值,类似于类型安全的 void*

文件系统库

  1. C++17 引入了文件系统库,用于处理文件和目录操作

constexpr 的改进

  1. C++17constexpr 进行了改进,允许更多的表达式在编译时计算

[[nodiscard]] 属性

  1. [[nodiscard]] 属性用于标记返回值不应被忽略

折叠表达式(Fold Expressions)

  1. C++17 引入了折叠表达式,简化了可变参数模板的处理

std::byte

  1. C++17 引入的一种新的数据类型,用于表示一个字节(8位)的数据
  2. 它提供了一种类型安全的方式来处理字节数据,避免了传统使用 unsigned char 进行字节操作所带来的潜在类型问题
  3. std::byte 位于头文件 <cstddef>

std::apply

概述

  1. C++17 引入的元组工具函数,用于将元组(std::tuple)的元素展开为函数的参数列表
    1. 将参数包应用到可调用对象上

支持 Lambda 和函数对象

结合结构化绑定

处理成员函数

元编程模板

  1. C++11/14
    1. 需要手动解包

  1. C++17新方法(std::apply

std::invoke

概述

  1. 统一调用语法
    1. 无论调用对象类型如何,均使用相同语法:

支持所有可调用类型

类型 示例
普通函数 std::invoke(add, 1, 2)
成员函数 std::invoke(&Class::method, obj, args...)
成员变量 std::invoke(&Class::member, obj)
函数对象 std::invoke([](int x) { return x*2; }, 3)
函数指针 std::invoke(func_ptr, args...)
  1. 用于调用可调用对象

成员函数的调用方式

  1. 自动处理对象类型(对象实例/指针/引用)

完美转发参数

std::apply 结合

  1. 展开元组参数进行调用:

动态内存分配对齐控制

  1. 支持指定动态内存的对齐方式:

constexpr 静态数据成员

  1. 允许在类内直接初始化 constexpr static 成员:

标准库新增

std::from_charsstd::to_chars

  1. 高性能字符串与数值的转换(不依赖本地化设置,无异常):

std::sample

  1. 从序列中随机抽样元素:

std::scoped_lock

  1. 多锁的 RAII 包装器,避免死锁:

std::not_fn

  1. 通用逻辑非包装器,替代 std::not1/not2

平凡类类型

概述

  1. C++中,平凡类类型(Trivial Types)是指具有非常简单构造和析构行为的类型
  2. 它们的对象可以通过简单的位复制(bitwise copy)来创建和销毁,而不需要额外的构造和析构代码

定义

  1. 平凡的默认构造函数:
    1. 如果有默认构造函数,它必须是平凡的,即编译器自动生成的,或者显式定义但没有自定义代码
    2. 隐式生成或显式 = default,且不执行额外操作
  2. 平凡的拷贝构造函数:
    1. 如果有拷贝构造函数,它必须是平凡的,即编译器自动生成的,或者显式定义但没有自定义代码
    2. 隐式生成或显式 = default
  3. 平凡的拷贝赋值运算符:
    1. 如果有拷贝赋值运算符,它必须是平凡的,即编译器自动生成的,或者显式定义但没有自定义代码
    2. 隐式生成或显式 = default
  4. 平凡的移动构造函数(C++11起):
    1. 如果有移动构造函数,它必须是平凡的,即编译器自动生成的,或者显式定义但没有自定义代码
    2. 隐式生成或显式 = default
  5. 平凡的移动赋值运算符(C++11起):
    1. 如果有移动赋值运算符,它必须是平凡的,即编译器自动生成的,或者显式定义但没有自定义代码
    2. 隐式生成或显式 = default
  6. 平凡的析构函数:
    1. 如果有析构函数,它必须是平凡的,即编译器自动生成的,或者显式定义但没有自定义代码
    2. 隐式生成或显式 = default,且不虚化
  7. 没有虚函数和虚基类:
    1. 类型不能有虚函数或虚基类

示例

  1. 平凡的

  1. 不平凡的

检查类型

平凡类型的关键用途

  1. 高效内存操作
    1. 平凡类型支持 memcpy/memmove 等底层操作,常用于序列化或数据传输:

  1. 静态初始化优化
    1. 平凡类型可能在编译期直接初始化,减少运行时开销:

C++17相关

  1. 聚合类的扩展
    1. C++17 允许聚合类包含 public 基类(需非虚继承),这可能导致某些类型更易满足平凡性条件:

  1. 类型特性工具完善
    1. C++17 新增的 std::is_aggregate 类型特征,结合 std::is_trivial 可更精确判断类型性质:

std::is_trivial<T>

  1. 检测是否平凡

std::is_trivially_copyable<T>

  1. 检测是否可平凡复制

与结构化绑定

  1. 平凡类型可直接解构:

与内联变量

  1. 平凡类型支持内联初始化:

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0 最后编辑于:2025-03-21
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享