C++ 使用[[可能未使用]]的结构化绑定
具有模式匹配的函数式语言(有时?)有可能忽略某些绑定值,但对于C++17结构化绑定,似乎没有办法做到这一点()。建议使用一个伪名称,但是我们会得到关于未使用变量的警告 有了clang和gcc的最新负责人,这做了预期的事情,这很好也很有用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
[[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]]
,但我认为推理可能是相同的。停止编译器警告不是一个用例。为了解决此问题,标准的工作草案获得了以下措辞():
可能未使用的
的实体,实现不应发出该实体或其结构化绑定(如果有)已使用或未使用的警告。对于未标记为的结构化绑定声明,除非其所有结构化绑定都未使用,否则实现不应发出此类警告
以前没有明确提到结构化绑定声明。我认为可能会阻止嵌套分解可能是一个问题。好的<代码>[g,[[可能未使用]]=foo()。。我想得越多,我就越能将单个属性放在外部:-)确实需要gcc>7.2才能使属性工作。因此[[maybe_unused]]可以防止警告,但也会丢失对实际要使用的返回值的任何检查。如果
maybe_unused
有一个用例,然后将maybe\u unused
附加到结构化绑定中声明的变量有一个用例。这只是声明变量的另一种方式。