C++11 局部和匿名类型作模板实参
【1】C++11支持局部的类型和匿名类型做模板的实参
在C++98中,标准对模板实参的类型还有一些限制。
具体地讲,局部的类型和匿名的类型在C++98中都不能做模板类的实参。
而在C++11标准中,支持做模板的实参。示例如下:
1 template<typename T> class X {}; 2 template<typename T> void TempFun(T t) {}; 3 4 struct A { } a; 5 struct { int i; } b; // b是匿名类型变量 6 typedef struct { int i; } B; // B是匿名类型 7 8 void fun() 9 { 10 struct C {} c; // C是局部类型 11 12 X<A> x1; // C++98通过 C++11通过 13 X<B> x2; // C++98错误 C++11通过 14 X<C> x3; // C++98错误 C++11通过 15 16 TempFun(a); // C++98通过 C++11通过 17 TempFun(b); // C++98错误 C++11通过 18 TempFun(c); // C++98错误 C++11通过 19 }
但是,需要注意的是,虽然匿名类型可以被模板参数接受,如下写法是不可以的:
1 template <typename T> 2 struct MyTemplate {}; 3 4 int main() 5 { 6 MyTemplate<struct { int a; } > t; // 无法编译通过,匿名类型的声明不能在模板实参位置 7 return 0; 8 }
good good study, day day up.
顺序 选择 循环 总结