为什么这段代码在编译时没有显示错误消息?
#include <initializer_list>
int main() {
auto [a, b] = { 1, 2 };
}
字符串
错误:无法分解无法访问的成员'std::initializer_list::_M_array'(属于'std::initializer_list')
Demo
但是,这段代码编译和工作正常吗?
#include <utility>
int main() {
auto [a, b] = std::make_pair(1, 2);
}
型
初始化器列表有什么特殊之处使得它的成员不可访问?
初始化器列表创建了一个带有私有字段(甚至是“不可访问的内部结构”)的对象(属于一个类),这是一种假设吗?还是有其他的东西在起作用?
1条答案
按热度按时间ecbunoof1#
结构化绑定与数组或类似元组的类型一起工作。来自cppreference:
我们用
E
来表示表达式e
的类型(换句话说,E
等价于std::remove_reference_t<decltype((
e))>
)。然后,结构化绑定声明以三种可能的方式之一执行绑定,具体取决于
E
:情况1:如果
E
是一个数组类型,则名称绑定到数组元素。案例二:如果
E
是非联合类类型,而std::tuple_size<E>
是具有名为value的成员的完整类型(不管该成员的类型或可访问性如何),则使用“类元组”绑定协议。案例三:如果
E
是非联合类类型,但std::tuple_size<E>
不是完整类型,则名称绑定到E
的可访问数据成员。std::initializer_list
既不是数组,也不是类元组,也没有任何可访问的成员。初始化器列表有什么特殊之处使得它的成员不可访问?
std::pair
是一个元组,它的first
和second
可以通过std::tuple_element
访问。