【发布时间】:2017-05-15 05:06:53
【问题描述】:
具有模式匹配的函数式语言(有时?)有可能忽略一些绑定值,但使用 C++17 结构化绑定似乎没有办法做到这一点(std::ignore with structured bindings?)。建议是使用虚拟名称,但随后我们会收到有关未使用变量的警告。
有了clang和gcc的最新头,这就是预期的事情,很好用,
[[maybe_unused]] auto x =4 ; // fine, no warning
[[maybe_unused]] auto [a,dummyb,dummyc] = std::tuple<int,int,float>(1,1,1.0f);
但我也希望这能奏效:
auto [g,[[maybe_unused]]dummyh,[[maybe_unused]]dymmyi] =
std::tuple<int,int,float>(1,1,1.0f);
这里不能使用attributes有什么具体原因吗? (在标准和技术上)。 gcc 和 clang 都不接受这个。
编辑,收集支持状态:(感谢godbolt/compiler explorer)。它按预期工作(也可能更早):
- gcc 8.0 主干(g++ 8.0.0 20171015 实验性)
- clang 4.0.0
- icc 18(未经测试,根据specs)
- msvc 19.22(可能更早)(已修复,根据bug report)
在 Godbolt 中试用 https://gcc.godbolt.org/z/H2duYd
【问题讨论】:
-
我想可能会阻止嵌套分解可能是一个问题。
-
嗯。好的...
[g,[[possibly_unused]]] = foo()..我想得越多,我就越能把那个单一的属性放在外面:-) -
确实需要 gcc > 7.2 才能使属性起作用。
-
所以 [[maybe_unused]] 阻止了警告,但是你也失去了对你实际想要使用的返回值的任何检查。
标签: c++ c++17 structured-bindings