转换为基数 class 从未使用过
Conversion to base class never used
我有两个类,一个是私有派生自另一个(因为不想暴露base的接口)。但是稍后我想创建对基础的引用。
我可以使用普通成员函数 base()
但不能使用转换运算符,因为永远不会调用此运算符
clang 发出警告,因为它说 "it will never be called"。
为什么cast运算符被私有元素忽略并覆盖?
这是语言不一致吗?
实际上,我认为它有一个它使 public 成为基本参考,仅此而已。
更重要的是,如果它有效,它可能是 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
}
在 a3
和 a4
的情况下,您正在使用左值初始化引用。在这种情况下,如果引用类型是初始化器类型的基础 class,则引用直接绑定到初始化器,不涉及任何转换 (C++17 [dcl.init.ref]/5)。
由于基 class 不可访问,程序格式错误 (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.
我有两个类,一个是私有派生自另一个(因为不想暴露base的接口)。但是稍后我想创建对基础的引用。
我可以使用普通成员函数 base()
但不能使用转换运算符,因为永远不会调用此运算符
clang 发出警告,因为它说 "it will never be called"。
为什么cast运算符被私有元素忽略并覆盖? 这是语言不一致吗?
实际上,我认为它有一个它使 public 成为基本参考,仅此而已。
更重要的是,如果它有效,它可能是 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
}
在 a3
和 a4
的情况下,您正在使用左值初始化引用。在这种情况下,如果引用类型是初始化器类型的基础 class,则引用直接绑定到初始化器,不涉及任何转换 (C++17 [dcl.init.ref]/5)。
由于基 class 不可访问,程序格式错误 (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.