base class 中删除的构造函数是否影响子 class?
Does a deleted constructor in base class influences on child class?
我在基 class 中删除了一个复制构造函数,但我不知道编译器是否会在子 classes 中创建一个隐式复制构造函数?还是基础 class 中删除的构造函数会阻止它?
template <typename val_t>
class exp_t {
public:
using vals_t = std::vector<val_t>;
exp_t() {}
exp_t(const exp_t<val_t> &) = delete;
exp_t(exp_t &&) = default;
virtual ~exp_t() {}
exp_t<val_t> &operator=(const exp_t<val_t> &) = delete;
exp_t<val_t> &operator=(exp_t<val_t> &) = delete;
exp_t<val_t> &operator=(exp_t &&) = default;
};
template <typename val_t>
class fact_t: public exp_t<val_t> {
using vals_t = std::vector<val_t>;
val_t m_value;
public:
fact_t(val_t &&value) : m_value{std::forward<val_t>(value)} {}
fact_t(fact_t &&) = default;
};
fact_t
会有隐式复制构造函数吗? (GCC 7)
不,因为默认的复制构造函数会调用父级的复制构造函数(已删除),这将不起作用。
你为什么不简单地测试一下:
int main() {
auto x = fact_t<int>(5);
auto y = x;
}
结果:
copytest.cpp: In function 'int main()':
copytest.cpp:32:14: error: use of deleted function 'fact_t<int>::fact_t(const fact_t<int>&)'
auto y = x;
^
copytest.cpp:21:7: note: 'fact_t<int>::fact_t(const fact_t<int>&)' is implicitly declared as deleted because 'fact_t<int>' declares a move constructor or move assignment operator
class fact_t: public exp_t<val_t> {
^~~~~~
我在基 class 中删除了一个复制构造函数,但我不知道编译器是否会在子 classes 中创建一个隐式复制构造函数?还是基础 class 中删除的构造函数会阻止它?
template <typename val_t>
class exp_t {
public:
using vals_t = std::vector<val_t>;
exp_t() {}
exp_t(const exp_t<val_t> &) = delete;
exp_t(exp_t &&) = default;
virtual ~exp_t() {}
exp_t<val_t> &operator=(const exp_t<val_t> &) = delete;
exp_t<val_t> &operator=(exp_t<val_t> &) = delete;
exp_t<val_t> &operator=(exp_t &&) = default;
};
template <typename val_t>
class fact_t: public exp_t<val_t> {
using vals_t = std::vector<val_t>;
val_t m_value;
public:
fact_t(val_t &&value) : m_value{std::forward<val_t>(value)} {}
fact_t(fact_t &&) = default;
};
fact_t
会有隐式复制构造函数吗? (GCC 7)
不,因为默认的复制构造函数会调用父级的复制构造函数(已删除),这将不起作用。
你为什么不简单地测试一下:
int main() {
auto x = fact_t<int>(5);
auto y = x;
}
结果:
copytest.cpp: In function 'int main()':
copytest.cpp:32:14: error: use of deleted function 'fact_t<int>::fact_t(const fact_t<int>&)'
auto y = x;
^
copytest.cpp:21:7: note: 'fact_t<int>::fact_t(const fact_t<int>&)' is implicitly declared as deleted because 'fact_t<int>' declares a move constructor or move assignment operator
class fact_t: public exp_t<val_t> {
^~~~~~