这种用户定义的转换不是不明确的吗?如果是这样,什么规则允许呢?

时间:2014-03-17 00:04:48

标签: c++ c++11

  

[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;
}

我错过了什么?

1 个答案:

答案 0 :(得分:7)

在这种情况下,演员符号(B)astatic_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&&)

转换构造函数赢得重载解析,因为从Aconst A&的隐式转换完全匹配。