11

我正在使用 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++ 错误?

4

1 回答 1

16

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

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

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

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

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


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

auto [a, b] = func1(x, y, z);
std::tie(a, b) = func2(x, y, z);
于 2018-05-14T03:16:53.373 回答