为什么C++结构化绑定不能使用初始化列表?

3mpgtkmj  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(113)

为什么这段代码在编译时没有显示错误消息?

#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);
}


初始化器列表有什么特殊之处使得它的成员不可访问?
初始化器列表创建了一个带有私有字段(甚至是“不可访问的内部结构”)的对象(属于一个类),这是一种假设吗?还是有其他的东西在起作用?

ecbunoof

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是一个元组,它的firstsecond可以通过std::tuple_element访问。

相关问题