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

C 17中结构化绑定引入的标识符类型是什么?

游高杰
2023-03-14

据我所知,C 17中结构化绑定引入的标识符实际上是对某些“隐藏”变量的引用。以至于

auto [ a, b ] = std::make_tuple(1, 2);

相当于

auto e = std::make_tuple(1, 2);
auto& a = std::get<0>(e);
auto& b = std::get<1>(e);

但是,如果我打印出std::is_reference


共有2个答案

饶谦
2023-03-14

据我所知,C 17中结构化绑定引入的标识符实际上是对某些“隐藏”变量的引用。

如果“reference”指的是语言结构的引用,那么这并不完全正确。声明中的说明符与您所说的“隐藏变量”有关。引用限定符是可选的。您展示的代码更像这样:

const auto& e = std::make_tuple(1, 2);
using E = remove_reference_t<decltype((e))>;
std::tuple_element<0, E>::type& a = get<0>(e);
std::tuple_element<1, E>::type& b = get<1>(e);
淳于鹏
2023-03-14

如果我打印出std::is_reference

为什么即使我们能证明ab引用元组中的元素,并且可以通过它们修改这些值?
我不是语言律师,但可能是由于标准(工作草案)的这个项目:

如果e是一个命名结构化绑定[…]的未加密id表达式decltype(e)是结构化绑定声明规范中给出的引用类型

旁注。您应该使用此表单,以便ab引用元组中的元素:

auto tup = std::make_tuple(1, 2);
auto & [ a, b ] = tup;

下面是一个简单的工作示例:

#include <tuple>
#include <type_traits>
#include <iostream>

int main() {
    auto tup = std::make_tuple(1, 2);
    auto & [ a, b ] = tup;
    a = 0;
    std::cout << a << ", " << std::get<0>(tup) << std::endl;
}

在Coliru上看到它。在另一边,你得到的是使用下面表达式的值的副本:

auto [ a, b ] = std::make_tuple(1, 2);

这里有一篇文章更好地解释了它,比人类的标准更容易理解。

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

  • 在该示例中,标识符和之间的相应区别是什么?据我所知,结构绑定中的也有一个引用类型,但是为什么为它指明了一个非引用类型呢?

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

  • 在[dcl.struct.bind]9.6.4中,当初始值设定项是带有

  • 考虑一个例子: 在这个简单的例子中,clang(输出:)和gcc(输出:)不一致。

  • 问题内容: 在SQL中,“结构化”一词是什么意思? 是否因为此(SQL)语言语句被组织为子句,表达式和谓词? 由于这个组织,它被称为“结构化”吗? 问题答案: 最初的全名是SEQUEL,代表“结构化英语查询语言”。由于商标问题,后来不得不将其重命名为SQL。 因此,基本上,这是将编程语言出售为“就像英语一样,除了具有正式语法外”的另一种尝试(因此称为“结构化”)。