11

在此代码中分配给 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;
}
4

1 回答 1

11

[class.conv.fct]

转换函数永远不会用于将(可能是 cv 限定的)对象转换为(可能是 cv 限定的)相同的对象类型(或对它的引用),转换为该类型的(可能是 cv 限定的)基类(或对它的引用),或对(可能是 cv 限定的)void。

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

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

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

于 2016-03-21T13:32:18.540 回答