右值(&&)与move语义
- void f(int&& i){ const int& a = std::move<int&>(i); }
函数返回值的类型推导+类型提示
- auto main() -> int { ... }
- 这里->后面可以使用decltype(E)表达式
- range-for:for(auto& v : L){ ... }
OOP中成员函数的控制
- =default =delete(之前是不写或private:限定)
- override final
- using Base::Base;(引入基类的构造函数,实际上也就引入了子类对应的默认构造函数)
编译期计算
- constexpr
- decltype(E)
- 初始化列表(避免了类型narrowing)
- X x{a}; ==> auto x = X{a};
原始正则表达式常量
- R"***("quoted string containing the usual terminator (")")***" 引用
- R代表""内\不需要转义为\\,而R"(....)"是扩展的写法,自定义终结符序列
unique_ptr
- 表示拥有关系,不可拷贝赋值
- unique_ptr<X> p(new X); // or {new X}
- return p.release(); //如果没有这里的release则行为等同于auto_ptr
- unique_ptr可以指定额外的deleter&参数
shared_ptr vs weak_ptr 引用
- 一个 weak_ptr 指向的是一个被 shared_ptr 所指向的对象。该 weak_ptr 可以用来决定该对象是否已被销毁。
- shared_ptr 相当于WebKit里使用的 RefPtr
- weak_ptr 不能被直接解引用,但可以:
- 通过shared_ptr构造
- 通过lock()返回
模板别名
- template<class T> using Vec = std::vector<T,My_alloc<T>>;
- 这个特性很有用,但不知道编译期能不能在报错时使用别名?
- 一般类型的别名:
- typedef void (*F)(double); --> using F = void (*)(double);
Lambda
- [](){} <-- 神奇的3个连写括号!
- 注意以值捕获和以引用捕获的差别
调用成员函数模板
- p->template mem_func<Type>(args);
- WebKit代码中的例子:wtf\HashSet.h
template<typename Value, typename HashFunctions, typename Traits>
template<typename T, typename HashTranslator>
typename HashSet<Value, HashFunctions, Traits>::iterator
inline HashSet<Value, HashFunctions, Traits>::find(const T& value) const
{
return m_impl.template find<HashSetTranslatorAdapter<HashTranslator> >(value);
}
Variadic模板
暂略
可扩展的随机数
- linear_congruential
- subtract_with_carry
- mersenne_twister
concepts