std::ignore 与结构化绑定?

新手上路,请多包涵

序幕:

 std::tuple<int, int, int> f();
std::tuple<int, int, float, int> g();

C++1z 将引入结构化绑定的语法,这将使编写而不是

int a, b, c;
std::tie(a, b, c) = f();

就像是

auto [a, b, c] = f();

但是, std::tie 也允许指定 std::ignore 以忽略某些组件,例如:

 std::tie(a, b, std::ignore, c) = g();

是否可以使用新的结构化绑定语法做类似的事情?它将如何运作?

原文由 jotik 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.1k
2 个回答

结构化绑定提案包含一个专门的部分来回答您的问题 ( P0144R2 ):

3.8 是否有办法显式忽略组件?

这样做的动机是消除关于未使用名称的编译器警告。我们认为答案应该是“还没有”。这不是由用例引起的(消除编译器警告是一种动机,但它本身不是用例),最好留到我们可以在更通用的模式匹配提议的上下文中重新审视这一点之前,这应该失败作为特例。

std::tie 对称会建议使用类似 std::ignore 的东西:

 tuple<T1,T2,T3> f();

auto [x, std::ignore, z] = f(); // NOT proposed: ignore second element

然而,这感觉很尴尬。

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

但是请注意,该标准的工作草案目前正在由相关国家机构 (NB) 进行修订,并且有一条 NB 评论要求此功能( P0488R0 ,US100):

分解声明应提供丢弃某些返回值的语法,就像 std::tie 使用 std::ignore

原文由 metalfox 发布,翻译遵循 CC BY-SA 3.0 许可协议

是否可以使用新的结构化绑定语法做类似的事情?

不,你只需要编一个后面不会提到的变量名。

原文由 Nicol Bolas 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题