47

具有模式匹配的函数式语言(有时?)有可能忽略一些绑定值,但是对于 C++17 结构化绑定,似乎没有办法做到这一点(std::ignore 与结构化绑定?)。建议是使用虚拟名称,但随后我们会收到有关未使用变量的警告。

使用 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);

是否有特定原因不能在这里使用属性?(在标准和技术上)。gcc 或 clang 都不接受这一点。


编辑,收集支持状态:(感谢godbolt/compiler explorer)。它按预期工作(也可能更早):

  • gcc 8.0 主干(g++ 8.0.0 20171015 实验性)
  • 铿锵声4.0.0
  • icc 18(未测试,根据规格
  • msvc 19.22(可能更早)(已修复,根据错误报告

在https://gcc.godbolt.org/z/H2duYd在 Godbolt 中试用

4

2 回答 2

28

在结构绑定文件中:

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 

然而,这感觉很尴尬。

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

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

于 2016-12-31T00:25:02.073 回答
14

作为对CWG 2360的决议,该标准的工作草案获得了以下措辞([dcl.attr.unused]):

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

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

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

于 2019-03-18T10:01:24.393 回答