结构化绑定是否可重用?

Sev*_*eux 6 c++ visual-c++ language-lawyer c++17 structured-bindings

我正在使用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
Run Code Online (Sandbox Code Playgroud)

E1277 attributes are not allowed here.

下面的代码也不会编译,同样的错误

double a, b;
[a, b] = func1(x, y, z);
[a, b] = func2(x, y, z);
Run Code Online (Sandbox Code Playgroud)

auto [a, b] = func1(x, y, z);
auto [a, b] = func2(x, y, z);
Run Code Online (Sandbox Code Playgroud)

也不会编译,理所当然地抱怨重新定义.

它编译的唯一方法是

auto [a1, b1] = func1(x, y, z);
auto [a2, b2] = func2(x, y, z);
Run Code Online (Sandbox Code Playgroud)

坦率地说,这很丑陋.

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

Jus*_*tin 8

结构化绑定必须具有auto.从cppreference:

attr(optional) cv-auto ref-operator(optional) [ identifier-list ] = expression ;
Run Code Online (Sandbox Code Playgroud)

...
cv-auto- 可能是cv限定的类型说明符auto
......

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

我们可以看到这cv-auto是强制性的.


如果你想重新绑定ab使用std::tie:

auto [a, b] = func1(x, y, z);
std::tie(a, b) = func2(x, y, z);
Run Code Online (Sandbox Code Playgroud)