【发布时间】:2016-01-08 03:14:31
【问题描述】:
struct A { A(int);};
struct B { explicit B(A); B(const B&);};
B b({0});
gcc 5.1.0 报错
/dev/fd/63:3:8: error: call of overloaded 'B(<brace-enclosed initializer list>)'
is ambiguous
/dev/fd/63:3:8: note: candidates are:
/dev/fd/63:2:27: note: B::B(const B&)
/dev/fd/63:2:21: note: B::B(A)
而 clang 3.6.0 成功。
哪一个是对的?为什么?
对于 gcc 5.1.0:http://melpon.org/wandbox/permlink/pVe9eyXgu26NEX6X
对于 clang 3.6.0:http://melpon.org/wandbox/permlink/WOi1md2dc519SPW0
这可能类似于Direct list initialization compiles successfully, but normal direct initialization fails, why?,其中 gcc 和 clang 得到相同的结果。
但这是一个不同的问题。 B(A) 在这里是明确的。 gcc 和 clang 得到不同的结果。
【问题讨论】:
-
@Columbo
B(A)在这里是明确的,stackoverflow.com/questions/32469979/… gcc 和 clang 得到相同的结果,但这里不同。 -
我猜这是由于不同的默认标准/标准支持。
-
@Columbo 这里增加的转折是
explicit,即使{0} -> const B&是复制列表初始化确实在重载决议期间考虑显式构造函数,只是使程序如果选择了一个,则格式错误。这可能足以使这个问题保持不变。 -
clang 接受这一点的原因似乎是它在为 13.3.1.7 进行重载解析时不考虑显式构造函数,而不是考虑它们并稍后出错。见coliru.stacked-crooked.com/a/6837d255e03c8775。这是可以理解的,因为 RichardSmith 在open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1902 向委员会报告了混乱
标签: c++ c++11 overloading