constexpr :会在编译期计算出来lambda:是98、03版带有operator()的局部仿函数当创建lambda函数的时候,编译器内部会生成这样一个仿函数,并从其你作用域中取得参数传递给lambda函数#############################################################################################__func__ :只能在函数内部使用,参数不行#pragma once = _Pragma("once")区别是,一个是宏,一个是操作符(预编译期也可使用)#define PR(...) printf(__VA_ARGS__)__LINE__,__FILE__只在宏函数中起作用,在普通函数中不起作用__cplusplus 宏已定义成一个具体数字,比如:201103Llong long : printf 时 lld llu编译期:static_assert(),需要的是常量参数noexcept() 默认noexcept(true),没有声明noexcept的函数,都是默认声明noexcept(true) 的template void fun() noexcept(noexcept(T())) {}第二个noexcept是运算符成员在定义时就初始化,相当于加在构造函数退出前初始化sizeof 可以计算类的非静态成员了sizeof(A::a) or sizeof(a.a)friend 可以省去class关键字,也可以应用于被 typedef 过的别名了,也可以应用于模板参数class P;template class People {friend T;};final:使用virtual接口无法子类重写override 是必须重写模板默认参数:template class Test{}; 函数模板默认参数的位置不受限制,模板类默认参数参照函数的默认参数的规则默认模板参数通常是需要跟默认函数参数一起使用的外部模板:作用参考extern 一个变量,用法也一样,即声明到一个头文件中为了减少编译时间,即明确表明不需要实例化。extern template void test ();显式实例化:template void fun (int);#############################################################################################类继承时,子类想使用可以using ,这种做法叫透传,透传也可以用在子类的构造函数上,而且只用一个using就可以using A::A; // 继承构造函数透传多个重载的构造函数委托构造:需要一个通用的初始化构造函数构造函数可能调用其他重载的构造函数:这种做法叫委派,这时的委派构造函数就相当于一个普通函数test(int i)try:m_i(i){}catch(...){}左值:有名称,可取地址将亡值:std::move后的T&&: 右值的引用T&: 左值的引用右值:不可取地址,不可赋值改变生存期移动std::move 基本等同于一个类型转换:static_cast (lvalue);通常就是一个static_cast被转化的左值,其生命期并没有随着左右值的转化而改变移动构造,注意原来的实例已经不能再用。应该尽量编写不抛出异常的移动构造函数,通过为其添加一个noexcept关键字,可以保证移动构造函数中抛出来的异常会直接调用terminate 程序终止运行,而不是造成指针悬挂的状态所谓完美转发(perfect forwarding),是指在函数模板中,完全依照模板的参数的类型,将参数传递给函数模板中调用的另外一个函数。转发:引用折叠(作为函数参数)TR 的类型定义 声明v 的类型 v 的实际类型T& TR A&T& TR& A&T& TR&& A&T&& TR A&&T&& TR& A&T&& TR&& A&&定义中出现了左值引用,引用折叠总是优先将其折叠为左值引用在类方面,多了移动构造函数和移动赋值函数显示转换函数:explicit operator bool() const { ... }{}初始化一切都可以了POD:兼容C,class要是平凡的;class对象的布局要是标准的。平凡的:无自定义构造/析构函数,无赋值,拷贝构造函数及其移动版;无虚函数。标准的:所有的非静态成员函数具有相同的访问权限;多重继承没有导致内存布局上变化的。bool operator "" _C()inline namespaceusing 模板别名:using aa=vector #############################################################################################改进>autoauto可以用在宏中。auto 非静态成员变量,auto 函数参数,auto 数组 不行。auto 知道类型想简写,decltype 知道类型想使用此类型。decltype 使用于范型,decltype有推导规则,只适用于表达式,不适用于函数名。decltype 会使const 或 valotile 失效,即成员不会继承对象的这些属性。追踪函数的返回类型:->typefor(auto e:...) /// 不修改元素内容for(auto& e:...) /// 修改元素内容for(const auto& e:...) gcc 编译也没错#############################################################################################enum class Type{}:强类型枚举值(不允许隐式转换)delete [] nullptr:okunique_ptr,shared_ptr参见参考右值特性来使用,weak_ptr,只有引用但没有计数,与shared_ptr合用#############################################################################################编译时常量:constexpr,const 运行时变长模板:template class tuple;element:模板参数包实现:递归继承(模板类继承),有三个步骤1,普通变长模板声明2,递归定义3,递归结束:template<> 已定义的模板类名字 { 用于继承的数据成员 }变长模板函数的话,内部也要递归实现sizeof...(),计算变长参数个数template class T: public B(A)...{};template class T: public B(A...){};扩展是不一样的。多线程cstdlib:atexit (C的退出注册函数)c++11,at_quick_exit,at_exit(正常退出)terminate,abort:异常退出#############################################################################################默认函数操作符operator,operator&operator&&operator*operator->operator->*operator newoperator delete声明了构造函数,导致非POD=default 显式默认=deleted 删除默认lambda: // 默认是一个const 函数[]()mutable->return-type{}[var] 按值传递单个变量[=],按值传递所有父作用域的变量(包括this)[&var][&] 按引用传递所有父作用域的变量(包括this)以上变量,只能是自动变量,即不能是全局及静态变量以上可以混用本质是一个类,重载了 operator() ,可以带参数,A a; a();按值传递时,变量值只计算一次,按引用时,在调用时计算by_ref_lambda ref;by_val_lambda const;alignof:查看对齐alginas:设定对齐c++原生字符串R"hello"R可与以下字符前缀一起使用。字符串前缀(表示编码方式)u8 u u32 (u 表示 unicode) L(表示w_char)\u4个16进制字符 表示某个UTF-16字符\U8个16进制字符 表示某个UTF-32字符