【发布时间】:2015-09-09 02:22:00
【问题描述】:
例如这样的代码:
struct A { A(int); };
struct B { B(A); };
int main()
{
B b{{0}}; // OK
B c({0}); // error
}
错误信息是:
f.cc: In function 'int main()':
f.cc:7:9: error: call of overloaded 'B(<brace-enclosed initializer list>)' is ambiguous
B c({0}); // error
^
f.cc:7:9: note: candidates are:
f.cc:2:12: note: B::B(A)
struct B { B(A); };
^
f.cc:2:8: note: constexpr B::B(const B&)
struct B { B(A); };
^
f.cc:2:8: note: constexpr B::B(B&&)
【问题讨论】:
-
是的,它应该是公开的。我已经改变了,谢谢!
-
令人惊讶的是,即使我删除了 B 的复制和移动构造函数,这也会失败:coliru.stacked-crooked.com/a/7fb30cd9d5839ac2 编译错误消息相当莫名其妙,它与已删除的函数有歧义。
-
@ChrisBeck 删除的函数参与重载解析,因此删除它们没有任何区别并不令人困惑
-
B b({{{0}}});这编译,我不知道为什么。也许是巫毒教?
-
我认为构造
{}的大括号形式从不假定 initializer 列表,但括号版本()总是这样做,即使没有 initializer 列表 构造函数。这个答案提供了一些信息,但不是一个确定的答案。 stackoverflow.com/questions/29851502/…
标签: c++ initialization overload-resolution