为什么(删除)复制构造函数优先于隐式转换?

时间:2015-11-18 21:40:38

标签: c++ implicit-conversion constructor-overloading

请考虑以下代码:

struct Bar{};

struct Foo
{
    Foo() = default;
    Foo(const Bar&) {}
    Foo(const Foo&) = delete;

    // IMPLICIT conversion to Bar
    operator Bar(){return {};}
};

int main() 
{
    Foo f1;
    Foo f2(static_cast<Bar>(f1)); // this is OK
    Foo f3(f1); // does not compile, why not implicit conversion to `Bar`?
}

班级Bar有一个用户定义的转化运算符Foo,接受Bar& s。但是,在main的最后一行,我希望将Foo f1转换为Bar,然后传递给Foo(const Bar&)。但是,仅考虑已删除的构造函数Foo(const Foo&) = delete;。我知道这个构造函数是一个更好的匹配,但为什么在重载集中也不是Foo(const Bar&),为什么编译器不执行隐式转换?

1 个答案:

答案 0 :(得分:6)

首选是因为在删除的成员函数上记录删除的定义之前会发生查找和重载解析。

也就是说,重载决策不会考虑delete说明符和您的通话:

Foo f3(f1);

由于f1属于Foo类型,Foo(const Foo&)是直接参数类型匹配。因此,重载分辨率的排名高于Foo(const Bar&)