当前位置: 首页 > 知识库问答 >
问题:

为什么结构化绑定只适用于自动

应涵容
2023-03-14

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。

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

共有2个答案

颜祖鹤
2023-03-14

此外,还可以使用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;
}
萧成文
2023-03-14

您得到的错误消息非常清楚地表明了为什么只允许auto:缺乏歧义会使语法更加依赖上下文。

表达式开头的一对方括号表示lambda。您所要求的是标准指定,有时[d2,i2]是lambda的开始,该lambda按值捕获d2i2,有时是解包分配。所有这些都是基于接下来的内容。

把它添加到语言中是不值得的。特别是,正如一些程序员所指出的,你已经有了std::tie来处理元组。

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

哦,如果你对std::tie只适用于元组感到不满,你可以自己扩展它来适用于任何POD。看看这个magic_get实现。人们可以将同样的想法应用于constepr将一个POD转换成一个引用元组,该引用元组可以馈送到std::tie。比如:

std::tie(d2, i2) = magic_unpack(/*some POD that isn't a tuple*/);
 类似资料:
  • 我在这里找到了最初的*C结构化绑定方案。它提出了一种轻松绑定多个返回值的方法,即: 但现在我看到每个人都指向 现在我学习了“列表是{like,this}编写的”,出现了一种新的列表语法?为什么?这里的花括号有什么问题?

  • 强制拷贝省略是否适用于通过结构化绑定进行的分解?适用于以下哪种情况? 我怀疑只有第三种情况允许拷贝省略,因为前两种情况将通过

  • 简短版本: 我希望能够将结构转换为元组。至少是那种类型。在下面的代码中,convertToTuple函数不起作用,因为可变参数不能用于结构化绑定(据我所知)。关键是:自动 基本上,我需要的是一种将自定义结构的类型转换为元组的方法,元组包含结构中的所有类型。例如: 具体问题: 我想创建一个模板函数,它将一个类型或一个类型列表作为模板参数,并生成一个纹理列表,每个纹理包含一个项目。另一个函数可以对纹理

  • 我正在学习结构化绑定声明。我的理解是,

  • 这是一个使用ValArray的简单c程序: 如果我像这样编译并运行它: 产出如预期: 但是,如果我像这样编译和运行它: 输出为: 如果使用优化参数,也会发生同样的情况。 GCC版本是(Archlinux最新版本): 但是,如果我尝试叮当,两者 和 产生相同的正确结果: clang版本是: 我还尝试了在Debian上使用GCC 4.9.2,其中可执行文件会产生正确的结果。 这是GCC中可能存在的错误

  • 为什么结构化绑定是通过一个唯一命名的变量和所有模糊的“name is bind to”语言定义的? 我个人认为结构化绑定的工作原理如下。给定一个结构: 以下内容: 大致相当于 数组和元组的等价展开式。但显然,这太简单了,而且有所有这些模糊的特殊语言用来描述需要发生的事情。 很明显,我遗漏了一些东西,但确切的情况是什么,一个定义良好的扩展,比如说,折叠表达式,在标准语言中读起来要简单得多? 似乎结构