请考虑以下代码:
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&)
,为什么编译器不执行隐式转换?
答案 0 :(得分:6)
首选是因为在删除的成员函数上记录删除的定义之前会发生查找和重载解析。
也就是说,重载决策不会考虑delete
说明符和您的通话:
Foo f3(f1);
由于f1
属于Foo
类型,Foo(const Foo&)
是直接参数类型匹配。因此,重载分辨率的排名高于Foo(const Bar&)
。