为什么(已删除)复制构造函数比隐式转换更受欢迎

Why is (deleted) copy constructor preferred over implicit conversion?

本文关键字:转换 受欢迎 构造函数 删除 复制 为什么      更新时间:2023-10-16

考虑以下代码:

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&)不在重载集中,为什么编译器不执行隐式转换?

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

也就是说,过载解决方案将不考虑delete说明符,并且在您的调用中:

Foo f3(f1);

由于f1的类型为Foo,因此Foo(const Foo&)是直接参数类型匹配。因此,在过载分辨率方面比Foo(const Bar&)具有更高的等级。