C++ C+中复制构造函数的继承+;17
考虑以下示例:C++ C+中复制构造函数的继承+;17,c++,inheritance,language-lawyer,c++17,copy-constructor,C++,Inheritance,Language Lawyer,C++17,Copy Constructor,考虑以下示例: struct Parent { Parent (); Parent (const Parent &); }; struct Child : public Parent { using Parent::Parent; }; Parent p; Child c (p); 这是取自以下问题: 最初的问题是关于C++11的。在C++11中,有一种措辞阻止Child获取采用const-Parent&的构造函数: 对于继承构造函数候选集中的每个非模板
struct Parent
{
Parent ();
Parent (const Parent &);
};
struct Child : public Parent
{
using Parent::Parent;
};
Parent p;
Child c (p);
这是取自以下问题:
最初的问题是关于C++11的。在C++11中,有一种措辞阻止Child
获取采用const-Parent&
的构造函数:
对于继承构造函数候选集中的每个非模板构造函数(不含参数的构造函数或具有单个参数的复制/移动构造函数除外),除非用户声明的构造函数具有相同的构造函数特征,否则将使用相同的构造函数特征隐式声明构造函数
出现using声明的类中的签名
极大地改变了继承构造函数的规范,并被认为追溯到C++11(我想是吧?)。N4429的目的是使基类构造函数像派生类构造函数一样可见,而不是声明委托给基类构造函数的派生类构造函数。在N4429的第一个版本中,有以下措辞,保留了C++11的限制:
当using声明声明类从基类继承构造函数时,基类的默认构造函数、复制构造函数和移动构造函数(如果有)将从引入的声明集中排除
然而,在本文件的更新版本中,这一措辞不再存在,也没有解释原因。该文件再次修订,然后并入标准。因此,在C++17中,我看不到任何规则会阻止上述代码的编译
尽管如此。克朗说:
继承的构造函数不是从相同或派生类型的表达式初始化的候选构造函数
但是,我在标准中找不到这样的内容
这段代码在C++17中是否格式错误?如果是,原因是什么
从类typeC
([class.inhctor.init])继承的构造函数,其第一个参数类型为“reference to cv1p
”(包括从模板实例化的构造函数)当构造cv2D
类型的对象时,如果参数列表只有一个参数,C
与P
相关,且P
与D
相关,则从候选函数集中排除
请参阅。这将被视为可追溯到C++17,对吗?是的,这是一个DR。您是否碰巧知道,为什么决议不简单地恢复删除的段落,以防止继承这样的构造函数?此解析是否允许这些构造函数在其他上下文中保持可见?在重载解析时间之前,您无法判断构造函数模板的最终外观。有趣的是,我回答了,但仍然找不到规则。。。