gpt4 book ai didi

c++ - 从未使用过的基类转换

转载 作者:行者123 更新时间:2023-11-27 23:44:00 25 4
gpt4 key购买 nike

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

我可以用一个普通的成员函数 base() 来做,但不能用一个 cast 运算符,因为这个运算符永远不会被调用

clang 对此发出警告,因为它说“它永远不会被调用”。

为什么转换运算符被私有(private)元素忽略和覆盖?这是语言不一致吗?

实际上,我认为它有一个它公开了基本引用,没有别的。更重要的是,如果它有效,它可能是明确的

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
}

最佳答案

a3a4 情况下,您正在使用左值初始化引用。在这种情况下,如果引用类型是初始化器类型的基类,则引用直接绑定(bind)到初始化器,不涉及任何转换 (C++17 [dcl.init.ref]/5)。

由于基类不可访问,程序格式错误(dcl.init.ref/4)。

我不确定 a5 中的访问检查规则,尽管它在实践中似乎没有实际意义,因为您不会设计代码以便有人必须编写该语法。

另见 [class.conv.fct]/1:

A conversion function is never used to convert a (possibly cv-qualified) object to the (possibly cv-qualified) same object type (or a reference to it), to a (possibly cv-qualified) base class of that type (or a reference to it), or to (possibly cv-qualified) void.

关于c++ - 从未使用过的基类转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52195809/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com