为什么结构化绑定不使用"auto&"返回对结构成员的引用,而是返回成员本身
why structured bindings don't return references to struct members using `auto&` but the members themselves are returned
我认为使用结构化绑定和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
相同,并且它们都不是引用。
在数组和类型案例中,结构化绑定不是引用 - 它们是相应成员的别名。这样做的主要原因是支持位域。不能引用位域,但可以具有位域的别名:
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()
对结构化绑定执行一些特殊操作 - 仅当绑定引用的成员是引用类型时,它才会为您提供引用类型,如下所示:
struct Y {
int& a;
int b;
};
void f(Y& y) {
auto& [a, b] = y;
// decltype(a) is int&, decltype(b) is int
}
相关文章:
- 从私有成员变量的成员方法返回unique_ptr
- 为什么我不能在返回 const 的布尔函数中为类成员变量赋值?C++
- 为什么结构化绑定不使用"auto&"返回对结构成员的引用,而是返回成员本身
- 如何在C++中允许成员函数的自定义返回类型进行类型擦除?
- 在模板化成员函数的返回类型中使用 std::enable_if 时的编译器差异
- 为什么在分配给成员变量之前获取unique_ptr的返回是一个问题?
- C++:如何返回指向非静态成员函数的指针?
- 为什么我可以改变常量对象中的成员变量,这是返回常量对象函数的结果?
- 类方法返回指向具有模板的类成员的指针
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 将成员函数的返回类型引用到C++中的自定义类
- 在C++如何从数组中提取成员并返回成员类型的数组?
- C++:私有类指针成员返回未定义的值
- 从类成员返回智能指针的正确方法?
- 在基类指针向量中,如何访问派生的类成员返回错误
- const成员返回为非const
- 通过向成员返回非常量引用来破坏封装
- C++:通过引用将 std::vector<> 成员返回到临时对象
- 从c++中类的函数成员返回一个数组
- 查询的类成员返回错误的值