【问题标题】:Why is a malformed function used instead of an implicit conversion?为什么使用格式错误的函数而不是隐式转换?
【发布时间】:2015-05-02 16:35:54
【问题描述】:

这是我的片段:

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

它工作正常。

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

【问题讨论】:

    标签: c++ c++11 ambiguity overload-resolution malformed


    【解决方案1】:

    已更新,感谢@T.C.

    Wrapper的ctor是模板 用户定义的转换,因此非模板 标准转换序列 重载Base&amp; 优先。访问检查仅在选择重载后执行 - 这对你来说太晚了。

    完整的规则比较复杂,更多可以找到here,看“最佳可行函数”部分。

    【讨论】:

    • 即使格式错误?!这并没有真正的意义,尤其是在这种情况下,Base 类被明确设为“私有”。
    • 我明白了,但这不是标准中的错误吗?没有隐式转换,甚至没有显式转换。还是谢谢!
    • @JakobRiedle 重载解析是 C++ 中最复杂的部分之一(恕我直言)。我什至不敢认为我知道所有情况下的所有规则,我知道什么是“正确的”甚至“更好”,或者随着时间的推移它是如何发展的。 :) 我想我们只能接受它。
    • 这不是模板与非模板;无论如何,该决胜局无法区分两个funcs,因为它们都不是模板。 Derived-to-base 转换被认为是一个标准的转换序列,它胜过用户定义的转换序列。
    猜你喜欢
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多