深入理解C++11
深入理解C++11
稳定性和兼容性
宏定义
| 名称 | 作用 |
|---|---|
__STDC_HOSTED__ |
判断是否拥有完整C库 |
__func__ |
返回函数名称 |
__cplusplus |
指出当前版本,用于版本兼容 |
构造方面
继承构造函数
class Base {
public:
Base(int val): val(val) {}
private:
int val;
};
class Derived: public Base {
public:
//just do some function, no extra member value. use inherit constructor.
using Base::Base;
};委托构造中对于异常的处理。看起来可能有点奇怪。
class base {
public:
base(int i) try : base() {
}
catch(...) {
}
private:
base() {
cout << "going to throw " << endl;
throw 0;
}
};垃圾回收
基本方式有
- 基于引用计数:reference counting garbage collector
- 基于追踪处理:tracing garbage collector
- Mark-Sweep
- Mark-Compact
- Mark-Copy
为什么C++支持垃圾回收的道路这么艰难呢?
主要是因为C/C++对于指针的放纵。看这个例子
int main() {
int *p = new int;
p += 10; //移动到别的地址,即原来的地址就没有被引用了。
p -= 10; //移动回来,但此时可能已经垃圾回收了,这块地址就无效了。
*p = 20; //如果已经被回收,那么这样就是undefined behavior。
return 0;
}类型推导
auto推导:推导出类型,但不保留const,volatile,引用等属性。
template推导:推导规则大部分和auto相似。
decltype推导:能够保留const,volatile,引用等属性
特性
decltype的妙用
推导返回值
变长模板
template<typename... Args>
void f(Agrs... args) {
cout << sizeof...(args) << endl; //打印有多少个参数。
func(args...); //将args作为参数调用func。
func(args)... //对每一个参数都调用func。
}万能引用
template<typename T>
void f(T&& t);完美转发在万能引用中的使用。
template<typename T>
void f(T&& t) {
func(std::forward<T>(t)); //保留t原有类型,转发给对应函数。
}
变长模板与万能引用
template<typename... Args>
void f(Agrs&&... args) {
}变长模板的完美转发
template<typename T>
void f(Args&&... args) {
func(std::forward<Args>(args)...); //多参数也能进行完美转发。
}其他API
is_same<>::value;
is_const<>::value;
is_volatile<>::value;
is_lvalue_reference<>::value; //判断是否左值引用
is_rvalue_reference<>::value; //判断是否右值引用 深入理解C++11
https://messenger1th.github.io/2024/07/24/C++/深入理解C++11/