一、模板表达式中的空格
在 C++11 之前,模板表达式中需要在两个闭合的模板参数之间加空格,以避免编译器解析错误。例如:
vector<list<int> >; // OK in each C++ version
在 C++11 及之后的版本中,这种要求已经被取消,可以写成:
vector<list<int>>; // OK since C++11
这种变化简化了模板表达式的书写,提高了代码的可读性。
二、nullptr
和 std::nullptr_t
C++11 引入了 nullptr
关键字,用于表示空指针。nullptr
是一个类型安全的空指针常量,可以用于任何指针类型,但不能用于整数类型。这避免了使用 NULL
或 0
时可能产生的类型不匹配问题。
void f(int);
void f(void*);f(0); // calls f(int)
f(NULL); // calls f(int) if NULL is 0, ambiguous otherwise
f(nullptr); // calls f(void*)
nullptr
的类型是 std::nullptr_t
,定义在 <cstddef>
中。std::nullptr_t
是一个基本数据类型,可以用于重载函数和模板。
#include <cstddef>typedef decltype(nullptr) nullptr_t; // 定义在 <cstddef> 中
三、自动类型推导(auto
)
C++11 引入了 auto
关键字,允许在声明变量时自动推导其类型。这在处理复杂类型或长类型名称时特别有用。
auto i = 42; // i 的类型为 int
double f();
auto d = f(); // d 的类型为 double
auto
也可以用于函数返回类型的推导:
auto add(int a, int b) -> int {return a + b;
}
在 C++11 中,auto
还可以用于 lambda 表达式的类型推导:
auto lambda = [](int x) -> bool {return x > 0;
};
auto
的使用简化了代码,提高了可读性,特别是在处理复杂类型时。
四、学习心得
通过学习,我对 C++11 的新特性有了更深入的理解。这些新特性,如模板表达式中的空格简化、nullptr
和 std::nullptr_t
、自动类型推导(auto
),都极大地提高了代码的可读性和安全性。
在实际编程中,合理使用这些新特性可以简化代码,减少错误,提高开发效率。例如,使用 nullptr
可以避免空指针的类型不匹配问题,使用 auto
可以简化复杂类型的声明,提高代码的可读性。