深入理解C++11 2.13 局部和匿名类型做模板实参

2019-08-08  本文已影响0人  zinclee123

C++98中,局部的类型和匿名的类型不能做模板类的实参,如

template<typename T> class X {};
template<typename T> void TempFun(T t) {};
struct A{} a;
struct {int i;}b;               //b是匿名类型变量
typedef struct {int i;}B;        //B是匿名类型

void fun(){
    struct C{} c;       //C是局部类型
    
    X<A> x1;            //C++98通过 C++11通过
    X<B> x2;            //C++98错误 C++11通过
    X<C> x3;            //C++98错误 C++11通过
    
    TempFun(a);         //C++98通过 C++11通过
    TempFun(b);         //C++98错误 C++11通过
    TempFun(c);         //C++98错误 C++11通过
}

需要注意的是,虽然匿名类型可以被模板参数接受,但是如下是不可以的

template <typename T> struct MyTemplate {};

int main(){
    MyTemplate<struct {int a;}> t; //无法编译通过,匿名类型的声明不能在模板实参位置
    return 0;
}
上一篇 下一篇

猜你喜欢

热点阅读