jot*_*tik 61 c++ language-lawyer c++17
序幕:
std::tuple<int, int, int> f();
std::tuple<int, int, float, int> g();
Run Code Online (Sandbox Code Playgroud)
C++ 1z将引入结构化绑定的语法,这样可以编写代替
int a, b, c;
std::tie(a, b, c) = f();
Run Code Online (Sandbox Code Playgroud)
就像是
auto [a, b, c] = f();
Run Code Online (Sandbox Code Playgroud)
但是,std::tie也允许指定std::ignore忽略某些组件,例如:
std::tie(a, b, std::ignore, c) = g();
Run Code Online (Sandbox Code Playgroud)
是否可以使用新的结构化绑定语法执行类似的操作?它会如何工作?
met*_*fox 46
结构化绑定提案包含一个回答您问题的专用部分(P0144R2):
3.8是否应该有明确忽略组件的方法?
动机是使编译器关于未使用名称的警告静音.我们认为答案应该是"还没有."这不是出于用例的原因(沉默编译器警告是一种动机,但它本身并不是一个用例),最好留待我们在上下文中重新考虑这一点.一个更一般的模式匹配提案,这应该作为一个特例.
对称与
std::tie建议使用类似的东西std::ignore:Run Code Online (Sandbox Code Playgroud)tuple<T1,T2,T3> f(); auto [x, std::ignore, z] = f(); // NOT proposed: ignore second element然而,这感觉很尴尬.
预期语言中的模式匹配可能会建议使用
_或者通配符*,但由于我们还没有模式匹配,因此选择我们知道将兼容的语法为时过早.这是一个纯粹的扩展,可以等待模式匹配.
但请注意,标准的工作草案目前正在由相关的国家机构(NB)进行修订,并且有一条NB评论要求此功能(P0488R0,US100):
分解声明应该提供语法来丢弃一些返回的值,就像
std::tie使用一样std::ignore.
dav*_*igh 10
C++26 将引入一个没有名称的漂亮占位符 (P2169R0)。借助这一新的语言功能,人们最终可以用作_忽略结构化绑定表达式中的变量的一种方法。有关设计的详细信息,请参阅链接文档。
使用新的结构化绑定语法是否可以做类似的事情?
不。您只需要组成一个变量名,以后将不再提及。
我通常使用_C++ 中的有效标识符,但看起来与 Kotlin 的下划线运算符相同,它会丢弃 lambda 参数。你最终会得到一个像这样的漂亮代码
map([&](auto it) {
auto [_, deviceServiceXAddr] = it;
return deviceServiceXAddr;
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8767 次 |
| 最近记录: |