• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2019-12-20 09:03 Aet 隐藏边栏 |   抢沙发  13 
文章评分 2 次,平均分 5.0

auto用于初始化列表

上述代码,在C++17之前,对于m的类型的推断,编译器给出的结果将不会是我们的预期的。
它会推断为std::initializer_list<int>,而不是int
同样,下面的代码也是会被推断为std::initializer_list<int>的:

C++17新标准中,这种类型推断的规则发生了变化。

结构化绑定

  1. 解构元组、结构体或数组为独立变量

内联变量

  1. 允许头文件中直接定义全局变量

折叠表达式

  1. 简化变参模板的参数包展开

类模板参数推导

  1. 自动推导模板参数类型

constexpr if

  1. 编译期条件判断,简化模板代码

贯穿[[fallthrough]]

  1. switch语句中,如果在一个case后面漏掉了break,那么程序还会继续执行到下一个case的内容。
  2. C++17新标准中,如果我们需要在某个地方故意使用贯穿行为,我们可以在该case原本break的位置写上[[fallthrough]]。来告诉编译器和阅读代码的人,我们在这个地方故意使用了贯穿行为。

[[nodiscard]]

  1. 强调返回值必须处理

[[maybe_unused]]

  1. 抑制未使用变量警告

控制在if()&&switch()中初始化变量并使用

  1. 因为认为将变量的作用域控制到使用它们的区域,是一种良好的编程风格。

  2. 所以,下方代码中,lower的作用域就有点超出它的范围了(因为它仅仅是被用来在if()里面判断一下的,其他地方根本就不会再使用到它)。

  3. 所以,为了改进这一点,C++17新标准中,专门引入了新的语法。

  4. 上述代码可修改为:

  5. 而且,为了完整起见,C++17新标准,还为switch语句添加了类似的语法。

std::size()

  1. 在必要时,我们需要确定数组的大小。
  2. 在C++17新标准,在标准库array头文件中提供了size()函数。

    1. size()函数不只适用于数组,还可以用来获取标准库定义的任何元素集合的大小(包括vectorarray
    2. 编译器会通过数组定义中初始值的数量来计算数组的大小。

关于数组的维数

  1. C++17中,不允许在运行期间指定数组的维数,数组的维数必须是一个编译器能计算的常量表达式。
    1. 但是,在目前的一些C++编译器中,是允许在运行期间指定数组的维数的。因为目前的C标准C11允许这么做,而C++编译器一般也编译C代码。

stringc_str()data()

概述

  1. 类似上面,可以将string转换为const char *C字符串。

  2. 第二种方法就是,C++17标准开始,我们使用string对象的data()函数,会得到一个非const char *的指针。

    1. C++17之前,使用data()得到的是一个const char *指针

    区别

  3. C++11之前

    1. c_str返回一个以'\0'结尾的C风格的字符串;data返回一个const char*指针。
  4. C++11之后

    1. 两者都返回const char* 指针。
  5. C++17之后

    1. c_str返回const char* 指针;data返回char* 指针。

关于Unicode

  1. C++17标准中,弃用了标准库提供的大部分在各种Unicode编码之间进行转换的功能。
    1. 推荐使用:ICU
    2. 或者在ICU基础之上的Boost.Locale

string_view字符串视图:新的const string引用

概述

  1. C++17标准库新增的string_view头文件中,定义了一个string_view的类型。
    1. 此类型的值的行为非常类似const std::string类型的值。
  2. 但有一个重要区别就是:

    1. 任何时候都不能通过它们的公共接口修改它们封装的字符串。
    2. 也就是说,某种程度上,string_view具有固定的常量特性
      我们可以查看view但不能修改string_view的字符。
    3. 这种局限性就意味着,这些对象和std::string是不同的,我们不需要自己操作字符数组的副本。
      相反,它只需要指向某个实际的string对象、某个字符串字面量或者其他任何字符数组中存储的任何字符序列即可。
      因为它不涉及复制字符数组,所以它的开销是很低的。

  1. 特点:
    1. tring_view没有c_str()函数来转换为一个const char * 数组,但它提供了data()函数
    2. 不能使用加法运算符来连接string_view,要这么操作的话,必须先将string_view转换成string

理解

  1. 只读试图
    1. string_view 确实不可修改底层字符串内容(类似 const std::string&),所有修改操作(如 remove_prefix()remove_suffix())仅调整视图范围,不改变原始数据
  2. 零拷贝开销
    1. 它仅存储指向原始字符串的指针和长度,构造时不复制数据,适合高频操作大字符串的场景

std::optional

概述

  1. C++17标准中,标准库提供了std::optional<>,它可以代替下述情况的可选值的隐式编码。通过使用这种辅助类型,可以使用optional<int>显示声明任何可选的int值。
  2. 当调用函数想让被调用函数使用其默认设置,或者因为无法计算实际的值而返回时,传统方法是使用某个或某些特定的值
    1. 就比如在string里面,如果在一个串里查找,find函数如果没找到,返回string::npos

  1. 关于nullopt,它是标准库定义的一个特殊常量,用于初始化好没有为T赋值的optional<T>.

总结理解

  1. 表示可能存在或不存在的值

检查头文件是否可用

  1. 标准库的每个新版本都提供了许多新的头文件,在这些头文件中定义了新的功能。
  2. 有的时候,我们需要使用多个编译器编译运行,可能是相同编译器的多个版本,或者针对不同目标平台的不同编译器。

    1. 这时候,需要有一种方式,在编译时检查当前编译器支持哪些功能,以便相应的启动或禁用代码的不同版本。
    2. C++17新标准,引入了__has_include()宏,可用来检查任何头文件是否可用。

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

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

发表评论

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