【问题标题】:why structured bindings don't return references to struct members using `auto&` but the members themselves are returned为什么结构化绑定不使用`auto&`返回对结构成员的引用,但返回成员本身
【发布时间】:2020-01-24 16:58:41
【问题描述】:

我认为使用结构化绑定和auto& 说明符我可以获得对结构成员的引用并直接使用它们而不是通过结构。

但是,以下代码有效并且静态断言成立:

struct Test
{
    int i;
    char c;
    double d;
};
Test test{ 0, 1, 2 };
auto& [i, c, d] = test;
i = 4;
c = 5;
d = 6;
// i, c, d are not references !
static_assert(!std::is_same_v<decltype(i), int&>);
static_assert(!std::is_same_v<decltype(c), char&>);
static_assert(!std::is_same_v<decltype(d), double&>);
cout << &i << " == " << &test.i << " (" << std::boolalpha << (&i == &test.i) << ")" << endl; // (true)
cout << test.i << ", " << (int)test.c << ", " << test.d << endl; // 4, 5, 6

但我认为 C++ 不允许一个变量有多个名称,除非一个是真实变量,而其他变量是引用,但在这种情况下,变量 itest.i 相同,两者都不是是参考。

【问题讨论】:

  • i 您显示的代码中的引用。 auto&amp; [i ... - 这是一个参考。
  • 如果两个变量的作用域不同,它确实允许这样做。

标签: c++ c++17 structured-bindings


【解决方案1】:

在数组和类型的情况下,结构化绑定不是引用——它们是对应成员的别名。这样做的主要原因是支持位域。你不能有一个位域的引用,但你可以有一个别名:

struct X {
    uint8_t a : 2;
    uint8_t b : 6;
};

void f(X& x) {
    auto& [a, b] = x; // fine, a just means "x.a"
    auto& a2 = x.a;   // error
}

除此之外,decltype() 在结构化绑定上做了一些special - 如果绑定引用的成员是引用类型,它只会给你一个引用类型,如下所示:

struct Y {
    int& a;
    int b;
};

void f(Y& y) {
    auto& [a, b] = y;
    // decltype(a) is int&, decltype(b) is int
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-28
    • 2011-12-19
    • 2021-08-23
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多