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

vso*_*tco 4 c++ constructor-overloading implicit-conversion

请考虑以下代码:

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`?
}
Run Code Online (Sandbox Code Playgroud)

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

101*_*010 6

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

也就是说,重载决议不会考虑说明delete符和你的调用:

Foo f3(f1);
Run Code Online (Sandbox Code Playgroud)

由于事实f1是类型Foo,Foo(const Foo&)是一种直接的参数类型匹配.因此,重载分辨率的等级高于Foo(const Bar&).

  • 是的,但是如果你有两个同样好的候选者,一个是`delete`d,我会期望编译器选择另一个.有什么理由不发生这种情况? (2认同)