大括号的数量如何影响统一初始化
How does the number of braces affect uniform initialization?
考虑以下代码片段:
#include <iostream>
struct A {
A() {}
A(const A&) {}
};
struct B {
B(const A&) {}
};
void f(const A&) { std::cout << "A" << std::endl; }
void f(const B&) { std::cout << "B" << std::endl; }
int main() {
A a;
f( {a} ); // A
f( {{a}} ); // ambiguous
f( {{{a}}} ); // B
f({{{{a}}}}); // no matching function
}
为什么每个调用都会产生相应的输出?大括号的数量如何影响统一初始化?括号省略是如何影响这一切的?
过载解决方案很有趣。
-
{a}
具有用于初始化(临时)const A&
参数的精确匹配秩,该秩胜过用户定义的转换B(const A&)
作为{a}
的实现。该规则是在C++14中添加的,用于解决列表初始化中的歧义(以及对聚合的调整)。请注意,概念临时是从未创建:在重载解析选择
f(const A&)
之后,引用被简单地初始化为引用a
,这种解释甚至可以应用于不可复制的类型。 - 允许将
const A&
参数(如上所述)初始化为的构造函数A
或B
,因此调用不明确 - 禁止将重复调用复制构造函数(此处为
A(const A&)
)作为多个用户定义的转换,而不是允许每个重载解析级别进行一次这样的转换。因此,在第二种情况下,最外面的大括号必须从{{a}}
初始化的A
初始化B
(允许)。(中间层的大括号可以初始化B
,但禁止将其与外层一起复制,并且没有其他方法可以尝试初始化。) - 每一种解释都涉及这样一种被禁止的额外转换
不涉及大括号省略——我们不知道允许它的最外层目标类型。
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 复制列表初始化的隐式转换的等级是多少
- 内联映射初始化的动态atexit析构函数崩溃
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 没有用于初始化C++中的变量模板的匹配构造函数
- 在未初始化映射的情况下,将值插入到映射的映射中
- C++成员初始化
- 初始化正在影响与初始化无关的代码
- 影响初始化顺序(以C++为单位)
- 大括号的数量如何影响统一初始化
- 在括号内包装初始化列表的影响是什么?
- 文件范围的原子是否受初始化顺序惨败的影响
- 数组初始化影响看似不相关的类C++SDL
- 等号在大括号初始化中是否有影响?例如。 'T a = {}'与'T a{}'
- 局部变量(大数组)的初始化如何影响堆栈大小
- 为什么引用的常量会影响它是否可以用不同类型的变量初始化