Joh*_*erg 37 c++ c++17 structured-bindings
具有模式匹配的函数式语言(有时?)有可能忽略一些绑定值,但是使用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);
Run Code Online (Sandbox Code Playgroud)
但我也希望这会奏效:
auto [g,[[maybe_unused]]dummyh,[[maybe_unused]]dymmyi] =
std::tuple<int,int,float>(1,1,1.0f);
Run Code Online (Sandbox Code Playgroud)
是否有一个特定的原因属性不能在这里使用?(在标准和技术上).gcc或clang都不接受这个.
编辑,收集支持状态:(感谢godbolt /编译器浏览器).它按预期工作(也可能更早):
MSVC 17.3.5(和Visual Studio GUI)允许该属性,但它不适用于结构化绑定.错误报告
Mik*_*l F 22
在结构绑定文件中:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0144r2.pdf
他们讨论他们的推理:
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然而,这感觉很尴尬.
预期语言中的模式匹配可能会建议使用像_或*这样的通配符,但由于我们还没有模式匹配,因此选择我们知道将兼容的语法为时过早.这是一个纯粹的扩展,可以等待模式匹配.
虽然这没有明确说明[[maybe_unused]],但我认为推理可能是相同的.停止编译器警告不是用例.
作为CWG 2360的一项决议,该标准的工作草案采用以下措词([dcl.attr.unused]):
该属性可以应用于类的声明,typedef名称,变量(包括结构化绑定声明),非静态数据成员,函数,枚举或枚举器。
对于标记为的实体
maybe_unused,实现不应发出警告,说明该实体或其结构化绑定(如果有)已使用或未使用。对于未标记的结构化绑定声明maybe_unused,除非未使用其所有结构化绑定,否则实现不应发出此类警告。
以前没有明确提到结构化绑定声明。