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

时间:2017-10-16 07:02:55

标签: c++ c++17 auto structured-bindings

c ++ 17引入了

Structured bindings。它们能够声明从元组或结构初始化的多个变量。

此代码使用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吗?

2 个答案:

答案 0 :(得分: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 :(得分: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;
}