C++ 使用[[可能未使用]]的结构化绑定

C++ 使用[[可能未使用]]的结构化绑定,c++,c++17,structured-bindings,C++,C++17,Structured Bindings,具有模式匹配的函数式语言(有时?)有可能忽略某些绑定值,但对于C++17结构化绑定,似乎没有办法做到这一点()。建议使用一个伪名称,但是我们会得到关于未使用变量的警告 有了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

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

有了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); 
[[maybe_unused]]auto x=4;//好的,没有警告
[[maybe_unused]]auto[a,dummyb,dummyc]=std::tuple(1,1,1.0f);
但我也希望这能奏效:

auto [g,[[maybe_unused]]dummyh,[[maybe_unused]]dymmyi] =
      std::tuple<int,int,float>(1,1,1.0f);
auto[g,[[maybe_unused]]dummy,[[maybe_unused]]dymmyi]=
std::tuple(1,1,1.0f);
有没有具体原因不能在这里使用?(在标准和技术上)。gcc和clang都不接受这一点


编辑,收集支持状态:(感谢)。其工作原理与中的预期一致(也可以更早):

  • gcc 8.0主干(g++8.0.0 20171015实验)
  • 叮当声4.0.0
  • icc 18(未经测试,根据)
  • msvc 19.22(可能更早)(根据

在结构绑定纸上的

处的godbolt中试用:

他们讨论他们的理由:

3.8是否有明确忽略组件的方法

这样做的动机是消除编译器对未使用名称的警告

我们认为答案应该是“还没有”。这不是出于使用动机 案例(沉默编译器警告是一种动机,但它不是 用例本身),最好在我们可以在 更通用的模式匹配建议的上下文,其中 作为特例而争吵

与std::tie对称建议使用 类似于std::ignore:

   tuple<T1,T2,T3> f(); 
   auto [x, std::ignore, z] = f(); // NOT proposed: ignore second element 
tuple f();
auto[x,std::ignore,z]=f();//未提议:忽略第二个要素
然而,这感觉很尴尬

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

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

为了解决此问题,标准的工作草案获得了以下措辞():

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

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


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

    我认为可能会阻止嵌套分解可能是一个问题。好的<代码>[g,[[可能未使用]]=foo()
    。。我想得越多,我就越能将单个属性放在外部:-)确实需要gcc>7.2才能使属性工作。因此[[maybe_unused]]可以防止警告,但也会丢失对实际要使用的返回值的任何检查。如果
    maybe_unused
    有一个用例,然后将
    maybe\u unused
    附加到结构化绑定中声明的变量有一个用例。这只是声明变量的另一种方式。