新的基于范围的for循环确实提高了可读性,并且非常易于使用。然而,考虑以下因素:C++ 11基于范围的for和map:可读性
map<Foo,Bar> FooAndAssociatedBars;
for (auto& FooAndAssociatedBar : FooAndAssociatedBars) {
FooAndAssociatedBar.first.doSth();
FooAndAssociatedBar.second.doSomeOtherThing();
}
它可能是一个细节,但我觉得它会是更具可读性,如果我可以做类似:
for ((auto& foo, auto& bar) : FooAndAssociatedBars) {
foo.doSth();
bar.doSomeOtherThing();
}
你知道等效语法?
编辑: 好消息:C++ 17具有这不会忽略问题的提案,称为结构化绑定(见1)。在C++ 17,你应该能够写:
tuple<T1,T2,T3> f(/*...*/) {
/*...*/
return {a,b,c};
}
auto [x,y,z] = f(); // x has type T1, y has type T2, z has type T3
解决了这个问题,可读性
编译器会如何猜测'Foo'和'Bar'是指什么? – 2013-03-20 14:50:20
@PeteBecker嗯,foo只是一个方便的方式来说“名字foo std :: pair的左边部分”。绝对而言,可以在编译时做到这一点:这只是一个符号方便。我想知道是否有可能通过重载或类似的方式获得这样的效果 – 2013-03-20 15:05:24
是的,当然可以要求编译器知道'std :: pair'或查找任何具有名为'first'和'秒';这很专业,可能不适合标准化。下一个请求将是'元组'的所有元素... – 2013-03-20 15:15:45