新式函数声明
C++11/14增加了一种新的函数语法,允许返回值类型后置
,它使用了
auto/ decltype
的类型推导能力,基本形式是:
auto func(...) -> type { ...} //新式函数声明语法
新语法的变化有两处。
首先,函数返回值处必须使用auto来“占位”(
auto不具有类型推导的功能);
其次,函数名后需要用“-> type” 的形式来声明真正
的返回值类型,这里的“type”可以是任意的类型,当然也包括decltype,例如:
auto func(int x) -> decltype (x)
// 使用decltype推导返回值类型
return X*x;}
函数返回值的可能类型需要由实际的参数来决定,所以有必要将返回值类型的声明“延后”,请看下面的示范代码:
template<typename T,typename U>
//模板参数列表
auto calc(T t, U u) -> decltype(t + u)
/ /后置式函数声明语法
{ return t+u;}
//返回两个变量之和
函数calc()是一个简单的模板函数,但它的返回值类型却无法用传统语法声明”,因为返回值类型必须由参数t和u决定,而在函数名之前这两个参数还未定义。后置式函数声明语法不是很常用,但关键时刻能够解决特定的问题,
defaultC++11/14重用了关键字default,允许程序员显式地声明类的缺省构造/析构等特殊成员函数,不仅能够明确地表示代码意图,而且可以让编译器更好地优化代码。
default的用法很容易理解,与声明纯虚函数的语法类似,在构造/析构等成员函数后面使用“=default”的方式就可以了,例如:
class default_ demopublic://显式指定构造函数和析构函数使用编译器的缺省实现 default_ demo ()= default;~default_ demo ()= default;//显式指定拷贝构造函数和拷贝赋值函数使用编译器的缺省实现default_ demo (const default demo&)= default;default_ demo& operator= (const default_ demo&) = default;//显式指定转移构造函数和转移赋值函数使用编译器的缺省实现default_ demo (default_ demo&&)= default;default demo& operator= (default_ demo&&)= default;};
使用default声明缺省构造函数后并不影响其他构造函数的重载与实现,我们仍然可以编写其他形式的构造函数:
delete在C++11/14里关键字delete也新增加了-种用法,可以让程序员显式地禁用某些函数一通常是类的构造函数和拷贝构造函数,以阻止对象的拷贝,例如:
class delete demo
public:
delete demo ()
= default;
//使用default缺省实现
~delete_ demo ()
= default;
//显式禁用拷贝构造函数和拷贝赋值函数
delete demo (const delete demo&)
= delete;
delete_ demo& operator= (const delete_ demo&)
= delete;
};
这样,delete_ demo就禁止了拷贝操作,变成了一个不可拷贝的对象,编译器会阻止任何拷贝构造或拷贝赋值的企图:
delete_ demo dl;//声明一个对象delete_ demo d2 = d1;/ /无法拷贝赋值,发生编译错误
显式delete不仅可以作用于类成员函数,也可以作用于普通函数,禁用某些形式的重载。
如需获取更多资料可以关注公众号“Auto笔记”,其分享汽车电子行业的最新资讯,及开发笔记、学习笔记等相关经验。关注公众号,获取相应文档。