void Composite::Feature()
{
std::cout << m_name << " Feature: support!" << std::endl;
std::list<Component*>::iterator iter = m_list.begin();
for (; iter != m_list.end(); iter++)
{
(*iter)->Feature();
std::cout << m_name << " iter: " << &(*iter) << std::endl;
std::cout << m_name << " *iter: " << *iter << std::endl;
}
for (auto& iter1 : m_list)
{
//(*iter1)->Feature(); //error
iter1->Feature();
std::cout << m_name << " iter1: " << iter1 << std::endl;
}
}
这里m_list的定义是std::list<Component*> m_list。
通过分别运行,可以看出这两个for的效果实际上是一样的,我原以为auto& iter1 : m_list中,iter1的类型应该是std::list<Component*>::iterator,然而事实却并非如此,在第二个for循环中使用(*iter1)->Feature()是编译不通过的。
我们可以通过在for循环中增加打印来分析一下,运行结果如下:
可以看出第一个for循环的(*iter)等效于第二个for循环的iter1,至于auto内部是怎么处理的,我们就不得而知了,只需要记住这个用法,小心使用即可。