C++模板函数返回类型前typename的使用差异及省略影响
C++模板返回类型中
typename的作用与区别 你给出的两个写法的核心差异
带
typename的写法(C++11及更早)typename std::remove_reference<T>::type里的typename是必须的:因为std::remove_reference<T>::type是依赖模板参数T的嵌套类型名——这个类型的存在和具体定义完全由T决定。C++编译器处理模板时,默认会把这种嵌套名称当成非类型(比如静态成员变量、成员函数),所以必须用typename明确告诉编译器:"这是一个类型名",不然编译器会直接报错。不带
typename的_t版本(C++14+)std::remove_reference_t<T>是C++14新增的别名模板,它其实是标准库帮你提前封装好了typename的写法,底层定义大概是这样:template<class T> using remove_reference_t = typename std::remove_reference<T>::type;因为别名模板本身已经解决了类型依赖的问题,所以用的时候直接写就行,不需要再加
typename。
完全去掉typename会怎么样?
如果把第一个版本的typename删掉,写成:
template< class T > std::remove_reference<T>::type&& move( T&& t );
编译器会把std::remove_reference<T>::type当成非类型成员(比如静态变量),直接触发编译错误——通常会提示"期望一个类型"之类的信息,因为它没法把这个名称解析成合法的返回类型。
内容的提问来源于stack exchange,提问作者Crackie
相关产品推荐
相关产品推荐

