我认为使用结构化绑定和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 ++不允许一个变量具有多个名称,除非一个是实变量而其他是引用,但在这种情况下,变量i
与test.i
相同。它们都不是参考。
答案 0 :(得分:6)
在数组和类型的情况下,结构化绑定不是引用-它们是对应成员的别名。这样做的主要原因是支持位域。您不能引用位域,但是可以为一个别名:
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
}