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

Lig*_*ica 3 c++ c++11

[C++11: 12.3/2]:用户定义的转换仅在明确无误的情况下应用.[..]

然而,以下在GCC和Clang主干中编译得很好:

struct B;
struct A
{
    A();
    operator B();
};

struct B
{
    B(const A&);
};

int main()
{
    A a;
    (B)a;
}
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Bri*_*ian 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&&)

转换构造胜由于从隐式转换重载解析Aconst A&是完全匹配.