【问题标题】:Can't get std::ignore working in structured bindings in for range无法让 std::ignore 在范围内的结构化绑定中工作
【发布时间】:2020-02-09 08:39:05
【问题描述】:

此代码可以编译并运行,但会出现“未使用的变量 i”警告:

for(auto [camera, i]: landmark->getObservations())
  camerasToCounts[camera]++;

我想忽略 i,所以我将其替换为 std::ignore。以下代码无法编译:

...
#include <tuple>
...
for(auto [camera, std::ignore]: landmark->getObservations())
  camerasToCounts[camera]++;

出现此错误:

error: expected ‘]’ before ‘::’ token

还有这个警告:

warning: unused variable ‘std’ [-Wunused-variable]

因为它无法识别 std::ignore。

一些上下文:

  • 我将 C++17 与 gcc 7.4.0 和 Eclipse CDT 一起使用。
  • 语法检查器显示与编译器相同的错误。这是连贯的。
  • 同一项目的许多 cpp 文件中的其他 for range 存在相同问题。这是一个普遍的问题,并不局限于特定的行。
  • 只是为了测试,这行编译得很好:

    std::ignore = 0;

所以 gcc 可以识别 std::ignore,它只是在 for 范围内无法识别。

已阅读 this good question and answer 关于忽略结构化绑定的内容。

有人遇到类似问题吗?

谢谢!

【问题讨论】:

    标签: c++ gcc eclipse-cdt structured-bindings


    【解决方案1】:

    结构化绑定声明了变量1,这些变量绑定到要返回的事物的成员/元素。这意味着您不能使用std::ignore,因为一方面它不是有效的变量名,另一方面它是一个已经声明的名称。如果你想忽略结果,只需将成员命名为ignore,不要像这样使用它

    for(auto [camera, ignore]: landmark->getObservations())
        camerasToCounts[camera]++;
    

    1:它实际上只创建了一个存储返回值的变量,然后方括号中的名称实际上是引用了返回对象的第 i 个成员。

    【讨论】:

      猜你喜欢
      • 2017-04-02
      • 2012-10-30
      • 1970-01-01
      • 2021-08-16
      • 1970-01-01
      • 1970-01-01
      • 2017-04-17
      • 1970-01-01
      相关资源
      最近更新 更多