学习网站
C语言中文网:C++11教程:C++11新特性大汇总
详细特性,请参考学习网站。
1、auto 类型推导
auto name = value;
2、decltype 根据 exp 表达式推导出变量的类型
auto varname = value;
decltype(exp) varname = value;
区别如下所示:
//auto 和 decltype 都是 C++11 新增的关键字,都用于自动类型推导,但是它们的语法格式是有区别的,如下所示:
auto varname = value; //auto的语法格式
decltype(exp) varname [= value]; //decltype的语法格式
//其中,varname 表示变量名,value 表示赋给变量的值,exp 表示一个表达式,方括号[ ]表示可有可无。
/*auto 和 decltype 都会自动推导出变量 varname 的类型:
auto 根据=右边的初始值 value 推导出变量的类型;
decltype 根据 exp 表达式推导出变量的类型,跟=右边的 value 没有关系。
另外,auto 要求变量必须初始化,也就是在定义变量的同时必须给它赋值;而 decltype 不要求,初始化与否都不影响变量的类型。*/
3、使用using定义别名(替代typedef)
//typedef 的定义方法和变量的声明类似:像声明一个变量一样,声明一个重定义类型,之后在声明之前加上 typedef 即可。这种写法凸显了 C/C++ 中的语法一致性,但有时却会增加代码的阅读难度。比如重定义一个函数指针时:
typedef void (*func_t)(int, int);
//与之相比,using 后面总是立即跟随新标识符(Identifier),之后使用类似赋值的语法,把现有的类型(type-id)赋给新类型:
using func_t = void (*)(int, int);
//从上面的对比中可以发现,C++11 的 using 别名语法比 typedef 更加清晰。因为 typedef 的别名语法本质上类似一种解方程的思路。而 using 语法通过赋值来定义别名,和我们平时的思考方式一致
4、C++11支持函数模板的默认模板参数
//在 C++98/03 标准中,类模板可以有默认的模板参数,如下:
template <typename T, typename U = int, U N = 0>
struct Foo
{
// ...
};
//但是却不支持函数的默认模板参数:
template <typename T = int> // error in C++98/03: default template arguments
void func()
{
// ...
}
//现在这一限制在 C++11 中被解除了。上面的 func 函数在 C++11 中可以直接使用,代码如下:
int main(void)
{
func(); //T = int
return 0;
}
5、C++11列表初始化(统一了初始化方式)
class Foo
{
public:
Foo(int) {
}
private:
Foo(const Foo &);
};
int main(void)
{
Foo a1(123);
Foo a2 = 123; //error: 'Foo::Foo(const Foo &)' is private
Foo a3 = {
123 };
Foo a4 {
123 };
int a5 = {
3 };
int a6 {
3 };
return 0;
}
6、lambda匿名函数
语法:
[外部变量访问方式说明符] (参数) mutable noexcept/throw()