C17常用新特性十模板特性

在C++的历次版本发布中,对C++模板参数的标准一直保持开放的态度,且对参数的要求也在逐渐放宽。从C++17开始,非类型的模板参数也可以在使用时定义了而不必定义在不同的作用域。1在模板中使用字符串在模板编程中,非类型的模板参数被限制了诸多条件,只能从以下几种类型中获取,如:枚举、对象、指针、常量以及函数的左值引用、字符串变量。对于字符串变量,使用方式和之前的版本并没有太大的区别,都不能直接在模板类型参数中使用。如下面的代码:

templateconstchar*pMsgclassExecptionMsg{//...};externconstcharexecptionMsg[]="Hello";//外部变量constcharexecptionMsg_1[]="World!";//内部变量voidfoo(){ExecptionMsgexecptionMsgmsg;//编译成功ExecptionMsgexecptionMsg_1msg11;//从C++11起编译成功staticconstcharexecptionMsg_2[]="HelloWorld!";ExecptionMsgexecptionMsg_2msg17;//C++17编译成功ExecptionMsg"Hello"msgError;//编译报错}如上代码所示,如果编译时没有注释:

ExecptionMsg"Hello"msgError;编译将会报错,报错信息如下:由此可见,在非类型的模板参数中,字符变量是不能直接使用的,在使用之前需要先进行定义。C++17除了继续遵守这个规范外,相对于之前的版本它允许在实例化模板的作用域内声明,然后使用。不得不说也算是一种进步了吧。2将指针作为模板实参从C++11开始,已经允许将指针作为模板的实参,但是还有一个限制,既在模板实例化时不能将一个返回指针的函数当做模板的实参。但是从C++17开始,可以在模板中使用一个返回指针的函数当做实参,如下面的代码在C++17版本编译器中可以通过:

#includeiostreamusingnamespacestd;templateint*pMsgclassExecptionMsg{//...};intiValue=10;constexprint*getInt(){returniValue;}intmain(){staticintnum=10;ExecptionMsgnumem;ExecptionMsggetInt()emf;return0;}在C++14版本编译器中编译报错如下:从报错信息可知,在C++17以前的版本中,使用指针作为模板的实参时需要对参数进行连接且不能将编译器内返回指针的函数在模板实例化时进行使用。

-EOF-

扫码


转载请注明:http://www.aierlanlan.com/rzdk/60.html

  • 上一篇文章:
  •   
  • 下一篇文章: