结构化绑定是否可重用?
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
是必须的。
如果要重新绑定 a
和 b
,请使用 std::tie
:
auto [a, b] = func1(x, y, z);
std::tie(a, b) = func2(x, y, z);
我正在使用 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 specifierauto
...
省略变体;只是改变 = expression
部分
我们可以看到cv-auto
是必须的。
如果要重新绑定 a
和 b
,请使用 std::tie
:
auto [a, b] = func1(x, y, z);
std::tie(a, b) = func2(x, y, z);