【发布时间】:2012-05-22 10:16:26
【问题描述】:
如果 X 类派生自 Y 类,并且 Y 类具有以下任何一种:
- 用户声明的复制构造函数,
- 用户声明的复制赋值运算符,
- 用户声明的析构函数
- 用户声明的移动构造函数,
- 用户声明的移动赋值运算符,
如果 X 类没有声明上述任何内容,移动构造函数和移动赋值运算符是否会被隐式默认?
例如
struct Y
{
virtual ~Y() {}
// .... stuff
};
struct X : public Y
{
// ... stuff but no destructor,
// no copy/move assignment operator
// no copy/move constructor
// will X have a default move constructor / assignment operator?
};
我目前正在使用 gcc,但我主要感兴趣的是正确的行为应该是什么(而不是特定编译器是否符合标准)..
【问题讨论】:
-
与您的问题无关,但如果您不知道 C++11 的情况,您现在可以使用
virtual ~Y() = default;而不是自己定义析构函数(尽管您的编译器可能没有支持它)。 -
@Luc Danton 出于兴趣,如果我使用
virtual ~Y() = default;会触发编译器隐式默认移动构造函数/赋值运算符吗?还是我需要明确默认这些操作? -
@mark - 不会,因为明确默认的析构函数是用户定义的析构函数。