为什么使用畸形函数而不是隐式转换

Why is a malformed function used instead of an implicit conversion?

本文关键字:转换 函数 为什么      更新时间:2023-10-16

这是我的片段:

class Base{};
class Derived : private Base{};
template<class T>
class Wrapper
{
    public:
        template<typename T2>
        Wrapper( T2&& )
        { }
};
// Function declarations
void func( Base& param );
void func( Wrapper<Derived> );
void funcUnambiguous( Wrapper<Derived> );

// Here is the Call:
Derived d = Derived();  
func( d );               // <- Error

GCC 4.9给我:error: 'Base' is an inaccessible base of 'Derived'

我做

Derived d = Derived();
funcUnambiguous( d );

它可以正常工作。

似乎,即使畸形畸形,也只需要便宜的铸件,即使隐式但昂贵的功能隐藏了。有人有线索吗?

已更新,多亏了 @t.c。

Wrapper的ctor是模板用户定义的转换,因此 non-template 标准转换序列Base&超载优先。选择过载后仅执行访问检查 - 在您的情况下为时已晚。

完整的规则很复杂,可以在此处找到更多,请查看"最佳可行函数"部分。