使用模板类编写一个容器打印的代码:
template<class T>
class P_STL
{
public:
void print(T &t)
{
for (mit = t.begin();mit != t.end();mit++)
{
cout << *mit << endl;
}
}
private:
//T::iterator mit; //error
//auto mit = T().begin(); //error
decltype(T().begin()) mit; //OK
};
问题有三个:
1、T()代表什么,为什么能正常使用?
2、第一个error能理解,T不是个具体类型;第二个为什么error?
3、decltype的ok和auto error的原因和区别是什么
decltype(expression)
是用来推导expression
表达式的类型,expression
并不会真正被执行,只用来推导类型,但是表达式必须是合法的表达式。
因此,decltype(T().begin())
中,T()
相当于构造一个类型为T的临时对象,T().begin()
返回这个临时对象的迭代器,因为整个表达式的类型就是容器T的迭代器类型。
https://en.cppreference.com/w/cpp/language/decltype
如果你要用第一种写法,前面要加typename
,即typename T::iterator mit;
目前C++标准不支持非静态成员变量声明为auto
,这中间缘由比较复杂,如果你感兴趣,可以看看下面帖子
https://cor3ntin.github.io/posts/auto_nsdmi/
其实你可以在print()
函数里直接用auto mit = t.begin();
,编译器会自动推导mit
的类型
void print(T &t)
{
for (auto mit = t.begin(); mit != t.end(); ++mit)
cout << *mit << endl;
}
decltype(。。。)代表推导括号内的表达式类型
auto 代表编译器自动推导出变量类型,它不能修饰非静态成员;