C++ Standard Library
*注:内容主要是对参考1的学习记录,知识点与图片大都来源于该书,
部分知识点与图片来源于参考2。具体参考信息,见最下方参考。*
C++98中新支持的语言特性
- 非类型模板参数
template<std::size_t N> class bitset;
。 - 模板类中的默认模板参数
template<typename T, typename Allocator = std::allocator<T>> calss vector
。 - 关键字typename用来表示随后的标识符是一个类型。
- 支持类的成员函数是成员模板函数,然而该成员函数不能是虚函数。
- 支持嵌套类模板。
- 基本类型的显示初始化
int x = int();
,该特性可以确保模板代码中任意类型的值都有一个初始化的默认值。
C++11中新支持的语言特性
- 模板尖括号之间不再需要空格符了,
vector<list<int>> // since c++11
- 关键字
nullptr // since c++11
- 关键字
auto // since c++11
,自动类型推导,从变量的初始化器中推导出该变量的类型。 - c++11支持统一的初始化形式,使用大括号。注意的是,{}初始化不能进行类型缩小转换。例如
int x{2.0}; // is wrong
。 - c++11支持初始化列表,如
int std::vector<int> v{2, 3, 4, 65}; // initializer list
。注意,如果一个类声明了
显示构造函数,则不可使用初始化列表。 - c++11支持foreach循环。
- c++11支持移动语义和右值引用,简单的说就是值传递的过程中不用再copy了,而是直接使用该值。
namespace std {
template<typename T, ...>
class set {
public:
... insert(const T& x); // for lvalues, copies the value
... insert(T&& x); // for rvalues, moves the value
};
}
- 返回一个非静态的局部对象的右值引用时错误的。
- c++11支持原生字符串(raw string)和多字节/宽字节字符串(multibyte/wide-character string)。
R"(\\n)"; // raw string, begin with R(", and end with )"
。为了能够在原生字符串中使用)"
,需要使用
分隔符。原生字符串的完整语法是R"delim(...)delim"
,其中delim是一个至多16个基本字符的字符序列,并且delim中
不能有反斜杠backslash,空白符whitespaces,与括号parentheses。如:
R"nc(a\
b\nc()"
)nc";
//等价于
"a\\\n b\\nnc()"\n "
多字节/宽字节字符串字面值