constexpr
constexpr是编译期就能确定的常量表达式,可用于常量的定义、函数的定义、构造函数的定义等。
- 用于常量的定义时,和const的使用一致,都表示只读变量
- 用于函数的定义时,需要满足如下4个条件:
- 该函数必须有返回值,即函数的返回值类型不能是 void
- 整个函数的函数体中,除了可以包含 using 指令、typedef 语句以及 static_assert 断言外,只能包含一条 return 返回语句
- return 返回的表达式必须是常量表达式
- 函数在使用之前,必须有对应的定义语句
类
=delete的使用
=delete来显式地禁止编译器自动生成某些函数
常见的应用主要在如下2类场景:
- 类的复制构造和类的赋值拷贝
class A{
public:
A() = default;
A(const A&) = delete; // 禁止复制拷贝
A& operator=(const A&) = delete; // 禁止赋值
};
- 模板中
template<typename T>
void F(T t) = delete;
template<>
void F<int>(int i) {
std::cout << "only for int " << i << std::endl;
}
禁止了F函数的模板的实例化,但是对F函数的int入参格式,进行了特例。
注意
:delete的使用还需要注意如下几个方面:
- 只能使用在类的成员函数中
- 不能对重载的函数进行使用
- 不在在子类中对父类中的纯虚函数进行使用
explict的使用
经常用于修饰类的构造函数,被修饰的构造函数的类,不可以在代码中使用原本由编译器提供的隐式转换,只能以显式的方式进行转换。
智能指针
todo
互斥锁
todo
线程池
todo
异常处理
todo