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

为什么结构化绑定引入变量作为值,而不是引用?

丁成弘
2023-03-14

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

所以,如果我使用auto

#include <cstddef>
#include <tuple>
#include <type_traits>

struct Foo {
    template<std::size_t i>
    int get() { return 123; }
};

namespace std {
    template<> struct tuple_size<Foo> : integral_constant<size_t, 1> {};
    template<std::size_t i> struct tuple_element<i, Foo> { using type = int; };
}

int main() {
    Foo f;
    auto& [x] = f;
    x++;
}

此外,C Insights清楚地表明clang将结构化绑定扩展为:

Foo f = Foo();
Foo & __f17 = f;
std::tuple_element<0, Foo>::type x = __f17.get<0>();
x++;

在这里,它声明x不是作为一个引用,而是作为一个值。为什么?

我预计左值引用和编译错误:e__f17在上例中)是左值引用。


共有1个答案

扶绍辉
2023-03-14

这是因为auto

如果改用auto[x],代码片段将扩展为如下内容

Foo f = Foo();
Foo __f17 = f; // Difference here
std::tuple_element<0, Foo>::type x = __f17.get<0>();
x++;

绑定本身始终是对底层对象的某种引用。然而,cppinsights代码并不能准确地表示这一点。C标准中的相关段落是这样说的

[dcl.struct.bind]

3否则,如果合格的idstd:: tuple_大小

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

  • 问题内容: 为什么我应该在Python中引用“名称”和“绑定”,而不是“变量”和“赋值”?我知道这个问题有点笼统,但我真的很想知道:) 问题答案: 在C和C ++中,变量是命名的内存位置。变量的值是存储在该位置的值。分配给变量,然后修改该值。因此,变量是存储位置,而不是其名称。 在Python中,变量是用于引用对象的名称。变量的值就是该对象。到目前为止听起来像是同一件事。但是将变量赋值给变量,您

  • 假设一个函数有两个重载 然后在另一个函数的主体中 过载<代码>f(T 这让我非常惊讶。一个带有签名

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

  • 现在,调用可能会调用的copy构造函数(它很可能是copy省略的,所以情况并非如此)。但将导致复制。如果包含大量数据,则可能是一个问题。 我们将通过将其作为常量引用()传递来改进它,以消除不需要的副本。只要是就可以。如果不是,则调用将导致编译错误(丢失限定符)。 所以,为什么要费心使用常量引用,只使用reference()。这很好,但对于第一种情况就不起作用了,因为将r-value绑定到(非常量)

  • 我一直在编写一组类来允许一个简单的类似python的-函数。下面的片段(几乎)和预期的一样工作。然而,两个变量和不是。 我一直在使用gcc 7.3.0。以下是MCVE: