问题 为什么不使用私人基地的演员?


在此代码中,分配给b1有效,但它不允许分配给b2(有或没有静态强制转换)。我实际上试图解决相反的问题,公共继承但不是隐式转换为基础。但是,似乎从未使用过演员。为什么是这样?

struct B {};    

struct D1 : private B {
    operator B&() {return *this;}
    B& getB() {return *this;}
};

struct D2 : public B {
    explicit operator B&() {return *this;}
};

struct D3 : public B {
    operator B&() = delete;
};

void funB(B& b){}

int main () {
  D1 d1;
  funB(d1.getB()); // works
  // funB(d1); // fails to compile with 'inaccessible base class
  D2 d2;
  funB(d2); // works
  D3 d3;
  funB(d3); // works 
  return 0;
}

8591
2018-03-21 13:13


起源

我无法复制您描述的编译错误。 - Peter
@Peter:复制 这里 - R_Kapp
@Barabas:我会等待标准中有适当引用的人提供答案,但将公共继承视为“is-a”,将私有继承视为“has-a”。即, D2 和 D3 是特殊情况 B,而 D1 是不是发生了这件事 有 一个 B。 - R_Kapp
这里的“私人”继承有什么意义? - lulyon
没有必要说明问题。这可能是真实世界代码的MCVE,也可能只是代码编写以扩展对C ++标准的理解。 - Simple


答案:


[class.conv.fct]

转换函数永远不会用于转换(可能是cv限定的)对象   到(可能是cv-qualified)相同的对象类型(或对它的引用), 到该类型的(可能是cv限定的)基类(或对它的引用),或(可能是合格的)无效。

所以在你的第一个例子中:

struct D1 : private B {
    operator B&() {return *this;}
    B& getB() {return *this;}
};

operator B& 永远不会被使用,因为它转换为基类。它是一个私人基类并不重要。


11
2018-03-21 13:32



因此,如果我理解正确,那么在进行显式转换时不可能继承,但不是隐含的,对吧? - Barabas
@Barabas不确定你在问什么。 - Barry
要么你公开继承,你的类将隐式转换为它的基础,或者你私下(或受保护)继承,它根本不会转换,甚至不使用static_cast / constructor。没有办法解决它,对吗? - Barabas