为什么(已删除)复制构造函数比隐式转换更受欢迎
Why is (deleted) copy constructor preferred over 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`?
}
类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&)
具有更高的等级。
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 有没有办法通过 main 函数访问受保护的矢量大小而无需将其转换为公共?
- 为什么模板构造函数比复制构造函数更受欢迎?
- 将对象强制转换为派生类以访问父类的受保护成员
- 如果我使用强制转换访问受保护的成员,可能会出现什么问题?
- 如何查询简单机器论坛以获取主题受欢迎程度/评级
- 为什么std::vector比std::deque更受欢迎
- 在 C 族中,在一个循环中,为什么"less than or equal to"比"less than"符号更受欢迎?
- 我可以安全地转换为兄弟类来包装受保护的函数吗
- 使用dynamic_cast向上转换到受保护的基
- 为什么RTTI似乎不受欢迎
- 模板化转换构造函数无法访问受保护的数据成员
- 为什么(已删除)复制构造函数比隐式转换更受欢迎
- 为什么在OpenCV如此完备的情况下,Matlab在计算机视觉社区如此受欢迎?< / h1 >
- 如何将派生类强制转换为受保护的基类