【发布时间】:2021-01-05 00:49:52
【问题描述】:
我有一段这样的现有代码:
struct Base {
Base() = default;
};
struct Derive: public Base
{
Derive() = default;
Derive(const Derive&) = delete;
Derive(Derive&& p) { *this = std::move(p); }
Derive& operator = (const Derive& p) = delete;
Derive& operator = (Derive&& p) {
return *this;
}
};
int main() {
Derive p;
}
它编译并工作。现在我想稍微更改类定义,以便始终使用某些整数参数构造 Base 或 Derived 类,并且永远不会在没有此类参数的情况下构造。
所以如果我尝试以下更改:
struct Base {
Base() = delete;
Base(int a_) : a{a_} {};
private:
int a; //new mandatory param;
};
struct Derive: public Base
{
Derive() = delete;
Derive(int a_) : Base(a_) {};
Derive(const Derive&) = delete;
Derive(Derive&& p) { *this = std::move(p); }
Derive& operator = (const Derive& p) = delete;
Derive& operator = (Derive&& p) {
return *this;
}
};
int main() {
Derive p{1};
}
我得到编译错误
main.cpp:15:2: error: call to deleted constructor of 'Base'
Derive(Derive&& p) { *this = std::move(p); }
^
main.cpp:4:2: note: 'Base' has been explicitly marked deleted here
Base() = delete;
^
1 error generated.
显然这种方式行不通。那么如何修改代码以使其编译并且永远不会调用任何参数构造函数而不会出错?
【问题讨论】:
标签: c++ class move-constructor