【发布时间】:2014-02-13 13:01:39
【问题描述】:
我想做如下的事情:
//std::vector<std::pair<TypeA, TypeB>> someInitializingFunction();
{
TypeA a;
TypeB b;
for (std::tie(a, b) : someInitializingFunction()) {
// do stuff;
}
}
但是,这不是有效的代码,因为正如标准所说,基于范围的 for 循环被定义为等同于:
{
auto && __range = range-init;
for ( auto __begin = begin-expr,
__end = end-expr;
__begin != __end;
++__begin ) {
for-range-declaration = *__begin;
statement
}
}
for-range-declaration 定义为:
范围声明: attribute-specifier-seq_{opt} decl-specifier-seq 声明符
那么让我退缩的是 decl-specifier-seq 没有标记为可选?
因此,我似乎必须为这个循环使用旧样式的循环:
std::vector<std::pair<TypeA, TypeB>> myList = someInitializingFunction();
{
TypeA a;
TypeB b;
for (auto it = myList.begin(); it != myList.end(); ++it) {
std::tie(a, b) = *it;
// do stuff;
}
}
但它在语法上似乎有点混乱,因为直觉上似乎是一个相当常见的任务,解包函数调用的结果,这在许多其他上下文中都是有效的。
有没有建议在语言中添加一些内容?这甚至是合理的想法吗?有没有更好的方法来做到这一点,我忽略了?我是否误读了标准?
显然,我可以组合自己的函数来执行此操作,但使用起来也有点混乱。
【问题讨论】:
-
更新: 在 C++17 中使用非常直观的语法可能会做到这一点。 They are currently working at "structured bindings"。然后可以这样做:
for (auto {a,b} : myList).
标签: c++ for-loop language-lawyer std-pair tie