gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:35:26 24 4
gpt4 key购买 nike

考虑下面的代码:

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&。然而,在 main 的最后一行,我希望 Foo f1 被转换为 Bar 然后传递给 Foo(常量条&)。但是,只考虑删除的构造函数 Foo(const Foo&) = delete;。我知道这个构造函数更匹配,但为什么 Foo(const Bar&) 不在重载集中,为什么编译器不执行隐式转换?

最佳答案

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

也就是说,重载决议不会考虑 delete 说明符,并且在您的调用中:

Foo f3(f1);

由于f1Foo类型,Foo(const Foo&)是直接参数类型匹配。因此,在重载解析方面的排名高于 Foo(const Bar&)

关于c++ - 为什么(删除的)复制构造函数优于隐式转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33790947/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com