2017-10-16 102 views
3

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,12] =元组;

#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吗?

+7

结构化绑定只有在定义和初始化变量时才可能。这是不可能的作为一般的任务(用于['std :: tie'](http://en.cppreference.com/w/cpp/utility/tuple/tie))。 –

回答

7

你得到的错误信息很好地表明了为什么它只允许与auto:缺乏歧义,这将使语法甚至更​​多上下文相关。

表达式开始的一对方括号表示一个lambda。你所要求的是标准来指定有时[d2 , i2]是一个lambda的开始,它按值捕获d2i2,在其他时间这是一个拆包分配。全部基于它后面的内容。

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

不仅如此,std::tie允许您忽略一些解压值,某些结构化绑定目前还不支持。所有这些都归结为一个更有限的语法糖,来完成标准库已经对元组进行的操作。


哦,如果你是disgruntles是std::tie仅适用于元组,可以展开它与任何POD自己的工作。看看这个magic_get implementation。可以将相同的想法应用于constexpr将POD转换为可以馈送至std::tie的参考元组。事情是这样的:

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

此外,您还可以使用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; 
} 
相关问题