首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么结构化绑定只适用于auto

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

Stack Overflow用户
提问于 2017-10-16 07:02:55
回答 2查看 4.9K关注 0票数 22

结构化绑定是与c++17一起引入的,它提供了声明从元组或结构初始化的多个变量的能力。

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

代码语言:javascript
复制
#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声明变量,就会得到错误

错误: d2,i2 =tuple的预期体;

代码语言:javascript
复制
#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吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-16 07:12:38

您得到的错误消息很好地说明了为什么只允许在auto中使用:缺乏歧义,这会使语法更加依赖上下文。

表达式开头的一对方括号表示lambda。您所要求的是标准指定,有时[d2 , i2]是通过值捕获d2i2的lambda的开始,而在其他时候则是一个解包分配。都是基于接下来发生的事情。

把它添加到语言中是不值得的。特别是,自从就像一些程序员注意到的以来,您已经有了std::tie来使用元组来做您想做的事情。

不仅如此,std::tie允许您忽略一些未打包的值,这是结构化绑定还不支持的。所以这一切归结为有一种更有限形式的语法糖,去做一些标准库已经用元组所做的事情。

哦,如果你对std::tie只对元组起作用感到不满的话,你可以自己把它扩展到与任何POD一起工作。看看这个实现。我们可以将同样的想法应用于constexpr,将一个std::tie转换成一个引用元组,并将其提供给std::tie。就像这样:

代码语言:javascript
复制
std::tie(d2, i2) = magic_unpack(/*some POD that isn't a tuple*/);
票数 18
EN

Stack Overflow用户

发布于 2017-10-16 07:38:48

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

代码语言:javascript
复制
#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;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46764614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档