可以在多态lambda中使用结构化绑定语法

Cur*_*ous 19 c++ lambda c++17

结构化绑定使得它更加干净和可读,以迭代通过具有基于如下循环的范围的映射

for (auto [key, value] : map) {
    cout << key << " : " << value << endl;
}
Run Code Online (Sandbox Code Playgroud)

但是结构化绑定可以在lambda表达式中使用,如下所示吗?

std::for_each(map.begin(), map.end(), [](auto [key, value]) {
    cout << key << " : " << value << endl;
});
Run Code Online (Sandbox Code Playgroud)

从它看起来上面的代码不适用于我在这里找到的在线C++编译器https://wandbox.org/permlink/sS6r7JZTB3G3hr78.

如果它不起作用那么是否有充分的理由不支持上述内容?或者它只是尚未提出的东西?模板只会在使用时被实例化,因此结构化绑定的"解除绑定"过程可能发生在请求实例化的地方(即调用函数时)

eca*_*mur 16

目前语法不允许这样做; 结构化绑定是一个简单的声明:

simple-declaration:[...]
- attribute-specifier-seq opt decl-specifier-seq ref-qualifier opt [ identifier-list ] initializer ;

函数参数由参数声明列表引入,其中包含声明符:

声明符指定这些实体的名称,并(可选)使用运算符(如*指针)和()(函数返回)修改说明符的类型.

也就是说,结构化绑定是一种(块级)语句语法 - 你可以通过注意它的语法以分号结尾来看到这一点;.允许在lambda参数列表中进行结构化绑定需要添加额外的语法.

这听起来是个好主意,我不能立即看到语法中的任何歧义; 它肯定值得讨论,因为它比替代方案更好地,更简洁地解决了您提出的用例.

  • @pasbi实际上有一篇论文致力于解决此问题(p0931),但不幸的是,由于lambda中的数组含糊不清(`[](auto [constant]){}`)以及许多事情都在变化与概念。将来在C ++ 23中可能会有机会,但是这似乎很难融入C ++ 20中:( (2认同)

alf*_*lfC 5

我认为这将是一个很好的建议(如果还没有的话),它将简化传递 zip 迭代器/引用元组的算法的代码。(例如https://github.com/correaa/iterator-zipper

同时,通过提取函数第一行的结构,使用更详细的代码似乎并不是无法实现的:

#include <algorithm>
#include <iostream>
#include <map>

using std::cout;
using std::endl;

int main(){
    auto map = std::map<int, int>{{1, 2}};
    std::for_each(map.begin(), map.end(), [](auto const& key_value){
        auto const& [key, value] = key_value;
        cout<< key <<" "<< value <<endl;
    });
}
Run Code Online (Sandbox Code Playgroud)

https://wandbox.org/permlink/sS6r7JZTB3G3hr78

(这强化了这一点:这是可实现的并且可以简单地添加到语言中)。

更精简的版本可以缩进为:

    [](auto const& _){auto&& [key, value] = _; // [](auto const& [key, value]){
        cout<< key <<" "<< value <<endl;
    }
Run Code Online (Sandbox Code Playgroud)

  • 对此有一项提案http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0931r0.pdf。但那年它最终在杰克逊维尔遭到了抵制,因为结构化绑定分解的语法与类似的数组参数不明确 https://wandbox.org/permlink/nkcENj2G2kuW31wb。遗憾的是我没有时间进一步跟进。 (5认同)
  • @好奇我明白了。数组再次阻碍了进展。我认为如果括号更愿意优先扩展/初始化元组,这不会成为问题。 (3认同)