Влияет ли удаленный конструктор в базовом классе на дочерний класс? - PullRequest
0 голосов
/ 12 декабря 2018

Я удалил конструктор копирования в базовом классе, но не могу получить, если компилятор создаст неявный конструктор копирования в дочерних классах?Или удаленный конструктор в базовом классе препятствует этому?

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)

1 Ответ

0 голосов
/ 12 декабря 2018

Нет, поскольку конструктор копирования по умолчанию будет вызывать конструктор копирования родителя (который удаляется), это не будет работать.

Почему вы просто не протестировали его:

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> {
       ^~~~~~
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...