1、auto和decltype
2、右值引用
左值:可以放在等号左边的值。可以取地址且有名字。例如:
-
前置自增自减表达式++i、--i
右值:不可以放在等号左边的值。不可以取地址且没有名字。例如:
-
后置自增自减表达式i++、i--
int a = b + c;
a是左值,有变量名,可以取地址,也可以放到等号左边, 表达式b+c的返回值是右值,没有名字且不能取地址,&(b+c)不能通过编译,而且也不能放到等号左边。
int a = 4; // a是左值,4作为普通字面量是右值
将亡值(c++11):即将要销毁的值,通过“盗取”其它变量内存空间方式获取的值,在确保其它变量不再被使用或者即将被销毁时,可以避免内存空间的释放和分配,延长变量值的生命周期,常用来完成移动构造或者移动赋值的特殊任务。
class A {
xxx;
};
A a;
auto c = std::move(a); // c是将亡值
auto d = static_cast<A&&>(a); // d是将亡值
参考:左值引用、右值引用、移动语义、完美转发,你知道的不知道的都在这里
3、std::function & std::bind & lambda表达式
4、智能指针
5、nullptr
nullptr是c++11引入的空指针常量值,NULL其实是个int型的值0,在重载函数中容易因为二义性编译失败。
void func(void *ptr) {
cout << "func ptr" << endl;
}
void func(int i) {
cout << "func i" << endl;
}
int main() {
func(NULL); // 编译失败,会产生二义性
func(nullptr); // 输出func ptr
return 0;
}
6、final & override
final:禁止当前类进一步派生,类中的虚函数禁止进一步重载。
override:修饰派生类的函数,表明函数是基类函数的重写。此函数必须在父类中存在虚函数。
参考: