gpt4 book ai didi

c++ - 大括号的数量如何影响统一初始化?

转载 作者:IT老高 更新时间:2023-10-28 12:46:10 24 4
gpt4 key购买 nike

考虑以下代码片段:

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

为什么每个调用都制造相应的输出?大括号的数量如何影响统一初始化?大括号省略对这一切有何影响?

最佳答案

Overload resolution像这样很有趣。

  1. {a}具有 完全匹配 等级,用于初始化(临时)const A&参数,胜过用户定义的转换 B(const A&)作为 {a} 的实现.此规则是在 C++14 中添加的,用于解决列表初始化中的歧义(以及对聚合的调整)。

    请注意,名义上的临时是从未创建:在重载决议选择 f(const A&) 之后,引用简单initialized to refer to a ,而这种解释 can apply即使是不可复制的类型。

  2. 允许初始化 const A& either A 的构造函数的参数(如上)或 B ,所以这个调用是模棱两可的。
  3. 禁止重复调用复制构造函数(此处为 A(const A&)),因为 multiple user-defined conversions ——而不是允许每级重载决议进行一次这样的转换。所以最外面的大括号必须初始化一个 B来自 A{{a}} 初始化在第二种情况下(允许)。 (大括号的中间层可以初始化一个 B ,但是与外层复制它是被禁止的,没有其他东西可以尝试初始化。)
  4. 每一种解释都涉及这种不允许的额外转换。

不涉及大括号省略——我们不知道允许它的最外层目标类型。

关于c++ - 大括号的数量如何影响统一初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54504463/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com