为什么结构化绑定仅适用于auto

问题描述 投票:7回答:2

Structured bindings已经引入了c ++ 17。它们能够声明从元组或结构初始化的多个变量。

此代码使用c++17编译器进行编译。

#include <iostream>
#include <tuple>

int main() {
    auto tuple = std::make_tuple(1.0, 1);

    auto [ d, i ] = tuple;

    std::cout << "d=" << d << " i=" << i <<  '\n';

    return 0;
}

如果我不用auto声明变量,我会得到错误

错误:lambda表达式的预期体[d2,i2] =元组;

#include <iostream>
#include <tuple>

int main() {
    auto tuple = std::make_tuple(1.0, 2);

    double d2;
    int i2;

    [d2 , i2] = tuple;

    return 0;
}

我使用clang version 4.0.0和编译选项-std=c++1z

我可以将现有变量分配给结构化绑定吗?我需要使用auto吗?

c++ c++17 auto structured-bindings
2个回答
9
投票

你得到的错误信息很好地说明了为什么它只允许使用auto:缺乏歧义会使语法更加依赖于语境。

表达式开头的一对方括号表示lambda。您要问的是标准规定有时[d2 , i2]是lambda的开头,它按值捕获d2i2,而在其他时候它是一个解包分配。一切都基于以下内容。

将它添加到语言中并不值得复杂。特别是,自as Some programmer dude noted,你已经有std::tie用元组做你想要的。

不仅如此,std::tie允许您忽略一些解压缩的值,结构化绑定尚不支持。所以这一切都归结为具有更有限形式的语法糖,做标准库已经用元组做的事情。


哦,如果你是std::tie仅与元组一起使用的不满,你可以扩展它以适应任何POD自己。看看这个magic_get implementation。可以将相同的想法应用于constexpr将POD转换为可以馈送到std::tie的参考元组。像这样的东西:

std::tie(d2, i2) = magic_unpack(/*some POD that isn't a tuple*/);

1
投票

此外,您可以使用std::tie()将元组解压缩到其各个组件中。如

#include <iostream>
#include <tuple>

int main() {
    auto tuple = std::make_tuple(1.0, 1);
    double d2;
    int i2;
    std::tie(d2, i2) = tuple;

    std::cout << "d2=" << d2 << " i2=" << i2 <<  '\n';

    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.