为什么使用格式错误的函数而不是隐式转换?

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

这是我的代码段:

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 的构造函数是 模板 用户定义的转换 ,因此 非template standard conversion sequence overload with Base& 优先。访问检查仅在 选择重载后执行 - 这对您来说太晚了。

完整的规则比较复杂,更多可以找here,看"Best viable function".

部分