结构化绑定使得它更加干净和可读,以迭代通过具有基于如下循环的范围的映射
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参数列表中进行结构化绑定需要添加额外的语法.
这听起来是个好主意,我不能立即看到语法中的任何歧义; 它肯定值得讨论,因为它比替代方案更好地,更简洁地解决了您提出的用例.
我认为这将是一个很好的建议(如果还没有的话),它将简化传递 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)
归档时间: |
|
查看次数: |
1522 次 |
最近记录: |