C++ 11相关新特性(using与typedef、尾置返回值类型)
目录
using与typedef
尾置返回值类型
using与typedef
using
在C++11中引入,using
和typedef
都可以用来为已有的类型定义一个新的名称。
二者最主要的区别在于,using
可以用来定义模板别名,using
还可以引入命名空间,而typedef
不能
typedef
主要用于给类型定义别名,但是它不能用于模板别名。
typedef unsigned long ulong;
typedef int (*FuncPtr)(double);
using
可以取代typedef
的功能,语法相对简洁。
using ulong = unsigned long;
using FuncPtr = int (*)(double);
- 对于模板别名,
using
显得非常强大且直观。
template<typename T>
using Vec = std::vector<T>;
- 作用范围:
using
还可以用于命名空间引入,typedef
没有此功能。
namespace LongNamespaceName {
int value;
}
using LNN = LongNamespaceName;
LNN::value = 42; // 相当于 LongNamespaceName::value
总之,更推荐使用using
,尤其是当你处理模板时。在现代 C++ 代码规范中,C++11 之后,许多代码规范建议优先使用using
而不是typedef
。这证明了在实际应用和代码维护中,using
更具有优势。
尾置返回值类型
在C++ 98中,函数的定义主要结构如下:
返回值类型 函数名(形式参数1, 形式参数2, ...)
{
函数体
}
但是如果返回值类型比较长,例如返回一个数组指针`int (*)[10]`时,上面的写法就会不便于阅读:
int (*)[10] func()
{
// ...
return arr; // 返回一个数组的首地址
}
而在C++ 11中,为了更好的可读性,可以使用->
结合对应的函数返回值放置于形参列表后方,而在原来的函数名前方需要使用auto
,所以下面的代码可以修改为:
auto func() -> int (*)[10]
{
// ...
return arr;// 返回一个数组的首地址
}
也可以结合decltype
关键字,如下:
template <typename T, typename U>
auto func(T a, U b) -> decltype(a + b)
{
return a + b;
}