代码之家  ›  专栏  ›  技术社区  ›  alfC

转换为从未使用过的基类

  •  0
  • alfC  · 技术社区  · 6 年前

    我有两个类,一个是从另一个私有派生的(因为我不想公开基的接口)。但是稍后我想创建一个对基的引用。

    我可以用一个普通的成员函数 base() 但不能使用cast运算符,因为从未调用此运算符

    为什么cast操作符被私有元素忽略和覆盖? 这是语言上的不一致吗?

    事实上,我认为它有一个公开的基础参考,而不是别的。 explicit .

    class A{
        int v_;
    public:
        void f(){}
    };
    
    class B : A{ // A is private base because I don't want the f() interface
        int w_;
    public:
        A const& base() const{return *this;}
        /*explicit*/ operator A const&() const{return *this;} // never called, warning in clang
    };
    
    int main(){
        A a = {};
        B b = {};
        A const& a2 = b.base();
        A const& a3 = b; // bad, But why?
        A const& a4{b}; // explict doesn't help
        A const& a5 = b.operator A const&(); // works in clang (but with a contradictory warning), doesn't work with gcc
    }
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   M.M    6 年前

    在案例中 a3 a4 您正在初始化具有左值的引用。在这种情况下,如果引用类型是初始化器类型的基类,则引用直接绑定到初始化器,则不涉及转换(C++ 17)。dcl初始参考]/5).

    由于基类不可访问,因此程序的格式不正确(dcl初始参考/4).

    a5 ,尽管这在实践中似乎没有实际意义,因为您不会设计代码以便有人编写语法。

    另请参见[类别转换fct]/1: