Информация об изменениях

Сообщение warning C5267: definition of implicit copy constructor for ' от 05.10.2023 19:10

Изменено 05.10.2023 21:09 Sm0ke

warning C5267: definition of implicit copy constructor for '
Есть проект, который писал не я
Компилирую его на msvc 2022 community
Параметры компиляции:
/Wall /wd"4738" /wd"4868" /wd"4710" /wd"4711" /wd"4505" /wd"4514" /wd"4820" /wd"4464" /wd"4435" /wd"5045" /wd"5027" /wd"4626" /wd"4866"


Получаю warning:

warning C5267: definition of implicit copy constructor for 'i_base' is deprecated because it has a user-provided destructor
* (фактическое имя класса тут заменил на i_base)


Минимальный пример, чтобы воспроизвести warning: https://godbolt.org/z/1j8Govn31
#include <iostream>

struct i_base
{
  //i_base() = default;
  //i_base(const i_base &) = default;
  //i_base(i_base &&) = default;

  virtual ~i_base() = default;

  virtual void go() = 0;
};

struct impl : public i_base
{
  void go() override {}
};

impl make()
{
  impl ret;
  return ret;
}

int main ()
{
  impl v = make();
  return 0;
}


Чтобы устранить warning я прислал автору проекта фикс патч, где определил конструкторы в интерфейсе (базовый класс)
(раскоментировать 3 строчки)

На что он мне ответил:

я что-то не понял, а нехера в интерфейсе с чисто виртуальными методами конструкторы?


Так мой фикс — норм решение, или как лучше сделать?
Вроде логично, чтобы в наследнике были конструкторы мув и копи по умолчанию — они должны быть таковыми и в базе.

p/s: gcc компилирует это без ворнингов и без явнно заданных конструкторов в интерфейсе https://godbolt.org/z/reTeYocYT
warning C5267: definition of implicit copy constructor for '
Есть проект, который писал не я
Компилирую его на msvc 2022 community
Параметры компиляции:
/Wall /wd"4738" /wd"4868" /wd"4710" /wd"4711" /wd"4505" /wd"4514" /wd"4820" /wd"4464" /wd"4435" /wd"5045" /wd"5027" /wd"4626" /wd"4866"


Получаю warning:

warning C5267: definition of implicit copy constructor for 'i_base' is deprecated because it has a user-provided destructor
* (фактическое имя класса тут заменил на i_base)


Минимальный пример, чтобы воспроизвести warning: https://godbolt.org/z/1j8Govn31
#include <iostream>

struct i_base
{
  //i_base() = default;
  //i_base(const i_base &) = default;
  //i_base(i_base &&) = default;

  virtual ~i_base() = default;

  virtual void go() = 0;
};

struct impl : public i_base
{
  void go() override {}
};

impl make()
{
  impl ret;
  return ret;
}

int main ()
{
  impl v = make();
  return 0;
}


Чтобы устранить warning я прислал автору проекта фикс патч, где определил конструкторы в интерфейсе (базовый класс)
(раскоментировать 3 строчки)

На что он мне ответил:

а зачем в интерфейсе с чисто виртуальными методами конструкторы?


Так мой фикс — норм решение, или как лучше сделать?
Вроде логично, чтобы в наследнике были конструкторы мув и копи по умолчанию — они должны быть таковыми и в базе.

p/s: gcc компилирует это без ворнингов и без явнно заданных конструкторов в интерфейсе https://godbolt.org/z/reTeYocYT