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-
扫码