c++ auto decltype 模板

使用模板类编写一个容器打印的代码:

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的原因和区别是什么

  1. decltype(expression)是用来推导expression表达式的类型,expression并不会真正被执行,只用来推导类型,但是表达式必须是合法的表达式。
    因此,decltype(T().begin())中,T()相当于构造一个类型为T的临时对象,T().begin()返回这个临时对象的迭代器,因为整个表达式的类型就是容器T的迭代器类型。
    https://en.cppreference.com/w/cpp/language/decltype

  2. 如果你要用第一种写法,前面要加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 代表编译器自动推导出变量类型,它不能修饰非静态成员;