在c++98/03的泛型程式設計中,模板例項化有乙個很繁瑣的地方,就是連續兩個右尖括號(>>)會被編譯解釋成右移操作符,而不是模板參數列的形式,需要乙個空格進行分割,以避免發生編譯時的錯誤。
template
class x{};
template
class y{};
int main()
;
在例項化模板時會出現連續兩個右尖括號,同樣static_cast、dynamic_cast、reinterpret_cast、const_cast表示式轉換時也會遇到相同的情況。c++98標準是讓程式設計師在》之間填上乙個空格,在c++11中,這種限制被取消了。在c++11標準中,要求編譯器對模板的右尖括號做單獨處理,使編譯器能夠正確判斷出」>>」是乙個右移操作符還是模板參數列的結束標記。
#include
#include //std::is_same
using
namespace
std;
using uint = unsigned
int;
typedef
unsigned
int uint;
using sint = int;
int main()
c++11之前,類模板是支援預設的模板引數,卻不支援函式模板的預設模板引數:
//1、普通函式帶預設引數,c++98 編譯通過,c++11 編譯通過
void defparm(int m = 3) {}
//2、類模板是支援預設的模板引數,c++98 編譯通過,c++11 編譯通過
template
class defclass {};
//3、函式模板的預設模板引數, c++98 - 編譯失敗,c++11 - 編譯通過
template
void deftempparm() {}
類模板的預設模板引數必須從右往左定義,數模板的預設模板引數則沒這個限定:
template
class defclass1;
template
class defclass2; // 無法通過編譯
template
class defclass3;
template
class defclass4; // 無法通過編譯
template
void deffunc1(t1 a, t2 b);
template
void deffunc2(t a);
c 11 模板的細節改進
c 11改進了編譯器的解析規則,盡可能的將多個右尖括號 解析為模板引數結束符,方便編寫模板相關的 1.模板的右尖括號 2.模板的別名 之前的c 使用 typedef 來為型別指定別名,在c 11中,可以使用using 來指定別名。typedef std map std string,int map ...
C 11新特性之模板改進 別名
include using namespace std template typename t class foo foo private t foo template typename u classa a private u a intmain 如上示例 1 在c 98 03標準中,巢狀模板的右...
詳解c 11新特性之模板的改進
c 11關於模板有一些細節的改進 模板的右尖括號 c 11之前是不允許兩個右尖括號出現的,會被認為是右移操作符,所以需要中間加個空格進行分割,避免發生編譯錯誤。int main 這個我之前都不知道,我開始學程式設計的時候就已經是c 11的時代啦。模板的別名 c 11引入了using,可以輕鬆的定義別...