5

这是我的片段:

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 );

它工作正常。

看起来,任何只需要廉价转换的函数,即使格式错误,也隐藏了隐式但昂贵的转换函数。有人有线索吗?

4

1 回答 1

5

已更新,感谢@TC

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

完整的规则很复杂,更多可以在这里找到,请查看“最佳可行函数”部分。

于 2015-05-02T16:38:04.473 回答