SFINAE 全称是substitution failure is not an error(“替换失败不是错误”),是C++模板当中的一项技术,感觉主要用途是在模板替换参数失败时,继续编译而不是报错并停止编译。
以下内容翻译自:https://www.cppstories.com/2016/02/notes-on-c-sfinae/
SFINAE 全称是substitution failure is not an error(“替换失败不是错误”),是C++模板当中的一项技术,感觉主要用途是在模板替换参数失败时,继续编译而不是报错并停止编译。
以下内容翻译自:https://www.cppstories.com/2016/02/notes-on-c-sfinae/
span
用于表示一段连续内存的范围。它提供了对底层数据的非拥有式引用,并支持类似数组的操作。
最大的作用是可以用于代替数组作为函数参数,把数组作参数时(非引用)会退化为指针,如果把数组当参数时,还得传递数组的长度, 这样就必须得两个参数了,比较麻烦。传递span就只需要一个参数,它代码更简单,更安全,不会越界。
optional可以处理那些可能为空的情况,尤其是作为函数返回值时。比如:一个函数返回值是int时,有时候会将-1作为异常值返回,但是有时候-1可能也是有效值,就又需要想异常值,这个时候optional就起到作用了。
modern C++中提到使用考虑使用置入代替插入,个人理解就是使用考虑使用emplace_back
代替push_back
操作,那么这两者之间究竟有什么区别,想探究一下
C++中的std::forward
函数是一个非常有用的工具,主要用于在泛型编程中完美转发(perfect forwarding)参数。在C++中,完美转发是指将函数模板中接收到的参数以原始形式(左值或右值)转发给另一个函数,保持参数的值类别(左值或右值)不变。
std::move
执行到右值的无条件的转换,但就自身而言,它不移动任何东西
内部的实现类似这样:
1 | template<typename T> |
C++中已经基本不推荐使用裸指针(手动进行new
和delete
),基本上都是使用智能指针。所以作为C++程序员必须学会智能指针的使用:auto_ptr
(已废弃不建议使用)、unique_ptr
、share_ptr
、weak_ptr
C++中存在enum
和enum class
两种,现代C++更加建议使用enum class
这种。理由主要有三点:
enum class
作用域更小,可以减少命名空间污染。enum
定义后,其中的枚举类作用域是整个enum
所在空间,可能对其他部分产生影响。比如
decltype
可以推导出变量或者表达式的类型,比如1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#include <iostream>
int main() {
int x = 5;
const int& y = x;
// 使用decltype获取变量的类型
decltype(x) a = 10; // a的类型为int
decltype(y) b = x; // b的类型为const int&
// 使用decltype获取表达式的类型
decltype(x + a) c = x + a; // c的类型为int
std::cout << "a: " << a << std::endl;
std::cout << "b: " << b << std::endl;
std::cout << "c: " << c << std::endl;
return 0;
}