auto 和 for循环
1 | std::vector<int> vec {1,2,3,4,5}; |
C++11的for使用方法简单了很多,但是上述对容器的遍历是只读的,也就是说遍历的值是不可修改的。
如果要修改遍历的值,需要将遍历的变量声明为引用类型:1
2
3
4
5
6
7
8
9std::vector<int> vec {1,2,3,4,5};
cout << "修改前" << endl;
for (auto& n :vec)
std::cout << n++;
cout << endl;
cout << "修改后" << endl;
for (auto j : vec)
std::cout << j;
结果:1
2
3
4修改前
12345
修改后
23456
maybe_unused (C++17 起)
[[maybe_unused]]
抑制针对未使用实体的警告。此属性可出现在下列实体的声明中:
- class/struct/union
- typedef
- 变量
- 非静态数据成员
- 函数
- 枚举
- 枚举项
可以说几乎能随处使用。若编译器针对未使用实体发布警告,则对于任何声明为 maybe_unused
的实体抑制该警告。
获取当前的程序路径
1 | std::filesystem::path current_path = std::filesystem::current_path(); |
代码经常出现相对路径,有时我们想的路径并不是我们需要的,此时最好获取一下当前的程序路径,再使用相对路径
static_assert
noexcept
查询表达式是否能抛出异常
std::as_const
需要头文件<utility>
,将左值转化为const类型
该方法接收一个引用参数,返回它的const引用版本。基本上,std::as_const(obj)
等价于 const_cast<const T&>(obj)
,其中T是obj的类型。与使用 const_cast
相比,使用 std::as_const()
可以使代码更短更易读。1
2
3
4
5string str = { "C++ as const test" };
cout << is_const<decltype(str)>::value << endl; // 0
const string str_const = std::as_const(str);
cout << is_const<decltype(str_const)>::value << endl; // 1
大括号初始化
在C++11中,自动变量和全局变量的初始化方式增加了几种:1
2
3int a = {3+4};
int a{6+8};
int a(6+8);
主要是大括号的用法,另外大括号内可以不包含任何内容,此时变量初始化为01
2int roc = {};
int roc{};
STL也可以用大括号的方式初始化,比如 vector1
vector<int> c{ 1, 2, 3 };
这显然不能从构造函数角度理解了,源于<initializer_list>
头文件中initialize_list
类模板的支持。只要#include<initializer_list>
并声明一个以initialize_List<T>
模板类为参数的构造函数,也可以使得自定义类使用列表初始化。
在C++11中,除了初始化列表(在构造函数中初始化)外,允许使用等=或花括号{}进行就地的非静态成员变量初始化,例如:1
2
3
4
5class example
{
int a = 1;
double b{ 1.2 };
};
如果在一个类中,既使用了就地初始化来初始化非静态成员变量,又在构造函数中使用了初始化列表,执行顺序是: 先执行就地初始化,然后执行初始化列表。
1 | enum class SensorType { |
using
1 | class MapBuilderInterface { |