[C++11: 12.3/2]:
用户定义的转化仅在明确无误的情况下应用。 [..]
然而,以下compiles just fine in GCC和Clang主干:
struct B;
struct A
{
A();
operator B();
};
struct B
{
B(const A&);
};
int main()
{
A a;
(B)a;
}
我错过了什么?
答案 0 :(得分:7)
在这种情况下,演员符号(B)a
与static_cast<B>(a)
(§5.4/ 4)相同。这又与初始化B t(a)
具有相同的语义,其中t
是临时的(§5.2.9/ 4)。由于B
具有类类型,并且初始化是直接初始化,因此只考虑B
的构造函数(§8.5/ 16)。适用的构造函数是:
B::B(const A&)
B::B(const B&)
B::B(B&&)
转换构造函数赢得重载解析,因为从A
到const A&
的隐式转换完全匹配。