【发布时间】:2014-03-08 16:44:41
【问题描述】:
如果你这样循环容器:
typedef std::vector<std::unique_ptr<BaseClass>> Container;
Container container;
for(Container::const_iterator element = container.begin(); element != container.end(); element++)
{
//Read through values
}
您决定使用 auto 来代替 typedef:
std::vector<std::unique_ptr<BaseClass>> container;
for(auto element = container.begin(); element != container.end(); element++)
{
//Read through values
}
假设您不更改值,auto 关键字是否使用 const 迭代器而不是非 const 迭代器?
这个问题最重要的是好奇心,我认为这是一个在现实生活场景中适用的问题的唯一原因是,如果您需要向其他编写代码的人传达您不会更改值的信息。
【问题讨论】:
-
呃,即使没有
auto,这也不是正确的代码。您必须在使用变量或面对 UB 之前初始化变量。如果你修复它并初始化它,它将变成初始化表达式的类型(基本上)。如果要显式 const 迭代,请使用cbegin/cend;否则begin/end. -
很抱歉没有非常彻底地初始化容器。
-
对不起,我没说清楚。容器很好;迭代器是未初始化的。未初始化的迭代器处于未定义使用它们的状态。顺便说一句,我没有投反对票。
-
Container::const_iterator element = container.begin();
标签: c++ loops c++11 vector auto