我知道这种问题已经被问了很多次,我也读过不同的答案,以及ISO标准的一些部分。
但是,我仍然需要澄清一些关于C++标准要求的确切行为的问题。
假设情况是这样的:
class A
{
public:
A( void ) {}
A( const A & a ) {}
};
class B: public A
{
public:
B( void ) {}
B( const B & b ) {}
};
我知道调用B
类的复制构造函数不会调用A
类的复制构造函数,我们可以使用初始化列表来正确实现。
我还知道使用using
来继承构造函数。
但是,如果派生类没有显式提供复制构造函数,而基类有,标准到底要求什么:
class A
{
public:
A( void ) {}
A( const A & a ) {}
};
class B: public A
{};
我一直认为编译器会隐式地为类B定义一个复制构造函数,从而隐藏类A的复制构造函数,因此不会调用它。
然而,看起来情况并非如此,在OS X 10.10上使用Clang编译时,会调用A的复制构造函数。
那么这是强制性的还是可以由实现定义的呢?这意味着我们不应该依赖这种行为吗?
在C++标准中,我找到了以下内容,但对我来说显然不是非常清晰:
“当使用odr-used(3.2)创建其类类型的对象(1.8)时,将隐式定义一个类的继承构造函数。隐式定义的继承构造函数执行将由使用声明的嵌套名称说明符中指定的基类命名的mem-initializer-id的mem-initializer-list的用户写入的内联构造函数的初始化集合以及下面指定的表达式列表,并且其函数体中的复合语句为空(12.6.2)。”
我真的很想得到关于它的澄清,根据标准,也考虑到多重继承。