结构化绑定是否可重用?

Are structured bindings reusable?

我正在使用 Windows 10,Visual Studio 2017 v15.7.1 和 /std:c++latest /permissive-

这段带有结构化绑定的简单代码无法编译:

auto [a, b] = func1(x, y, z); // auto func1() -> std::tuple<double, double, double>
[a, b] = func2(x, y, z); // same signature as func2

E1277 attributes are not allowed here.

下面的代码也无法编译,同样的错误

double a, b;
[a, b] = func1(x, y, z);
[a, b] = func2(x, y, z);

代码

auto [a, b] = func1(x, y, z);
auto [a, b] = func2(x, y, z);

也不会编译,正确地抱怨重新定义。

它编译的唯一方法是

auto [a1, b1] = func1(x, y, z);
auto [a2, b2] = func2(x, y, z);

坦率地说,这很丑。

这个功能是这样设计的吗?还是 VC++ 错误?

结构化绑定必须具有 auto。来自 cppreference:

attr(optional) cv-auto ref-operator(optional) [ identifier-list ] = expression ;

...
cv-auto - possibly cv-qualified type specifier auto
...

省略变体;只是改变 = expression 部分

我们可以看到cv-auto是必须的。


如果要重新绑定 ab,请使用 std::tie:

auto [a, b] = func1(x, y, z);
std::tie(a, b) = func2(x, y, z);