【发布时间】:2016-10-17 08:42:34
【问题描述】:
[...] 命名构造函数的 using 声明不会创建同义词;相反,如果附加构造函数在用于构造相应基类的对象时可访问,则它们是可访问的,并且忽略 using 声明的可访问性。 [...]
因此,以下代码无法编译:
class B { protected: B(int) { } };
class D: B { using B::B; };
int main () { D d{0}; }
它返回的错误与所有主要编译器都或多或少相同:
在这里声明保护
另一方面,以下代码编译:
class B { protected: B() { } };
class D: B { using B::B; };
int main () { D d{}; }
难道不应该因为与上一个示例中导致错误的相同原因而导致编译失败吗?
它允许它编译什么?
【问题讨论】:
-
提示:
D没有用户声明的构造函数。 -
@T.C.我也是这么想的,但是using-declaration的可访问性被忽略了,那么在第二种情况下不应该继承和保护默认构造函数吗?
-
好的,另一个提示。如果类没有用户声明的构造函数,[class.ctor]/4 会说什么?在给定 [namespace.udecl]/15 的情况下,它如何与基类构造函数交互?
-
顺便说一句,只有 Clang 3.9 实现了 P0136R1 语义(您正在引用)。旧规则根本不继承默认构造函数。
-
@T.C.因此,您隐含地说默认构造函数不是继承的,即使是用户定义的构造函数也是如此。或者更好的是,当我们寻找使用定义的构造函数时,继承的构造函数不参与。对吗?
标签: c++ c++11 language-lawyer default-constructor inherited-constructors