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

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;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容