为什么使用格式错误的函数而不是隐式转换?
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".
部分
这是我的代码段:
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".
部分