【问题标题】:Structured bindings with the same names具有相同名称的结构化绑定
【发布时间】:2017-11-20 03:57:42
【问题描述】:

我正在编写一些 OpenGL 应用程序,无论如何。在一个地方,我决定使用结构化绑定,因为它可以节省我大量的打字时间。这里是:

for (auto row = 0; row < N - 1; ++row) {
            for (auto col = 0; col < N - 1; ++col) {
                //glColor3f(colors[row][col].R, colors[row][col].G, colors[row][col].B);
                auto[xu, xv, yu, yv, zu, zv] = normal_points[row][col];
                factor = std::sqrt((yu * zv - zu * yv) + (zu * xv - xu * zv) + (xu * yv - yu * xv));
                glNormal3f((yu * zv - zu * yv) / factor, (zu * xv - xu * zv) / factor, (xu * yv - yu * xv) / factor);
                glVertex3f(points[row][col].x, points[row][col].y, points[row][col].z);
                //glColor3f(colors[row + 1][col].R, colors[row + 1][col].G, colors[row + 1][col].B);
                auto[xu, xv, yu, yv, zu, zv] = normal_points[row+1][col];
                factor = std::sqrt((yu * zv - zu * yv) + (zu * xv - xu * zv) + (xu * yv - yu * xv));
                glNormal3f((yu * zv - zu * yv) / factor, (zu * xv - xu * zv) / factor, (xu * yv - yu * xv) / factor);
                glVertex3f(points[row + 1][col].x, points[row + 1][col].y, points[row + 1][col].z);
                //glColor3f(colors[row][col + 1].R, colors[row][col + 1].G, colors[row][col + 1].B);
                auto[xu, xv, yu, yv, zu, zv] = normal_points[row][col+1];
                factor = std::sqrt((yu * zv - zu * yv) + (zu * xv - xu * zv) + (xu * yv - yu * xv));
                glNormal3f((yu * zv - zu * yv) / factor, (zu * xv - xu * zv) / factor, (xu * yv - yu * xv) / factor);
                glVertex3f(points[row][col + 1].x, points[row][col + 1].y, points[row][col + 1].z);
            }
        }

现在的问题是第一次绑定(使用normal_points[row][col])它可以完美运行。但是当我为normal_points[row+1][col] 执行此操作时,我得到的数字是相同的。但在normal_points 2D 数组中它们不是。证明:

所以在Watch 1 选项卡中,您可以看到数组中的这些值不同,但是当我从第一个断点跳转到第二个断点时,xu, xv 等的值没有改变。我该如何解决?是因为我用了相同的名字吗?如果是这样,我不能使用相同的名称吗? (因为我有第二个循环,就像这个循环一样,它确实可以节省大量打字并提供可读性)

【问题讨论】:

  • 请不要将代码呈现为图像...
  • 我想展示Watch标签,但也包括断点
  • 你能提供一个minimal reproducible example吗?没有图片?

标签: c++ visual-studio c++17 watch structured-bindings


【解决方案1】:

对不起,我很惊讶你的代码可以编译。

你写了次,在同一个范围内,

auto[xu, xv, yu, yv, zu, zv] = <something>;

所以您定义了 三次 次,在相同的范围内,相同的变量。

建议:使用不同的名称

auto [xu1, xv1, yu1, yv1, zu1, zv1] = normal_points[row][col];
// ...
auto [xu2, xv2, yu2, yv2, zu2, zv2] = normal_points[row+1][col];
// ...
auto [xu3, xv3, yu3, yv3, zu3, zv3] = normal_points[row][col+1];

或使用三个不同的作用域

for (auto col = 0; col < N - 1; ++col)
 {
    {
      auto [xu, xv, yu, yv, zu, zv] = normal_points[row][col];
      // ...
    }
    {
      auto [xu, xv, yu, yv, zu, zv] = normal_points[row+1][col];
      // ...
    }
    {
      auto [xu, xv, yu, yv, zu, zv] = normal_points[row][col+1];
      // ...
    }
 }

【讨论】:

  • MSVC 允许编译并实际运行。我实际上得到了您自己发布的解决方案。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-06-07
  • 2019-10-14
  • 2016-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-14
相关资源
最近更新 更多