与[[maybe_unused]]结构化绑定

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 /编译器浏览器).它按预期工作(也可能更早):

  • gcc 8.0 trunk(g ++ 8.0.0 20171015实验)
  • 铿锵4.0.0
  • icc 18(未经测试,根据规格)

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的东西:

   tuple<T1,T2,T3> f(); 
   auto [x, std::ignore, z] = f(); // NOT proposed: ignore second element 
Run Code Online (Sandbox Code Playgroud)

然而,这感觉很尴尬.

预期语言中的模式匹配可能会建议使用像_或*这样的通配符,但由于我们还没有模式匹配,因此选择我们知道将兼容的语法为时过早.这是一个纯粹的扩展,可以等待模式匹配.

虽然这没有明确说明[[maybe_unused]],但我认为推理可能是相同的.停止编译器警告不是用例.

  • 如果“maybe_unused”具有用例,则将“maybe_unused”附加到在结构化绑定中声明的变量也具有用例。这只是声明变量的另一种方式。 (5认同)

met*_*fox 6

作为CWG 2360的一项决议,该标准的工作草案采用以下措词([dcl.attr.unused]):

  1. 该属性可以应用于类的声明,typedef名称,变量(包括结构化绑定声明),非静态数据成员,函数,枚举或枚举器。

  2. 对于标记为的实体maybe_unused,实现不应发出警告,说明该实体或其结构化绑定(如果有)已使用或未使用。对于未标记的结构化绑定声明maybe_unused,除非未使用其所有结构化绑定,否则实现不应发出此类警告。

以前没有明确提到结构化绑定声明。