warning C5267: definition of implicit copy constructor for '
От: Sm0ke Россия ksi
Дата: 05.10.23 19:10
Оценка:
Есть проект, который писал не я
Компилирую его на 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
Отредактировано 05.10.2023 21:09 Sm0ke . Предыдущая версия . Еще …
Отредактировано 05.10.2023 19:10 Sm0ke . Предыдущая версия .
Re: warning C5267: definition of implicit copy constructor for '
От: reversecode google
Дата: 05.10.23 19:49
Оценка: 37 (1)
https://developercommunity.visualstudio.com/t/Compiler-warning-5267-triggers-for--de/10470151?space=8&amp;q=cpu&amp;sort=newest
Re: warning C5267: definition of implicit copy constructor for '
От: reversecode google
Дата: 05.10.23 19:51
Оценка:
https://github.com/llvm/llvm-project/issues/60977
Re: warning C5267: definition of implicit copy constructor for '
От: sergii.p  
Дата: 05.10.23 20:11
Оценка:
Здравствуйте, Sm0ke, Вы писали:


S>Параметры компиляции:

S>
S>/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"
S>


S>Так мой фикс — норм решение, или как лучше сделать?


я бы компилировал ещё с /wd"5267" — дурацкий ворнинг в данном случае
Re[2]: warning C5267: definition of implicit copy constructor for '
От: Кодт Россия  
Дата: 05.10.23 21:26
Оценка:
Здравствуйте, reversecode, Вы писали:

R>https://developercommunity.visualstudio.com/t/Compiler-warning-5267-triggers-for--de/10470151?space=8&amp;q=cpu&amp;sort=newest


Прикольная грабелька в стандарте.
https://eel.is/c%2B%2Bdraft/class.mem#class.copy.ctor-6

If the class definition does not explicitly declare a copy constructor, a non-explicit one is declared implicitly. If the class definition declares a move constructor or move assignment operator, the implicitly declared copy constructor is defined as deleted; otherwise, it is defaulted ([dcl.fct.def]).
The latter case is deprecated if the class has a user-declared copy assignment operator or a user-declared destructor ([depr.impldec]).

То есть, неважно, виртуальный деструктор, шмиртуальный, — написал хоть что-нибудь про деструктор — ннна!
struct Base
{
    ~Base() = default;
};

void test()
{
  Base one;
  Base two = one;
}

https://godbolt.org/z/Wcvn7qPdh

В принципе, смысл этого понятен: еслм мы делаем что-то содержательное в деструкторе, то семантика copy elision подвергается сомнению. И наверное, надо делать что-то соответствующее в конструкторе копирования (хотя бы и задефолтить его явно).
Base test() {
  Base one;
  return one;
}
Перекуём баги на фичи!
Re[3]: warning C5267: definition of implicit copy constructor for '
От: reversecode google
Дата: 05.10.23 22:44
Оценка: 78 (2)
обожаю эту тупую картинку которую все давно знают

https://howardhinnant.github.io/smf.jpg
Re[3]: warning C5267: definition of implicit copy constructor for '
От: flаt  
Дата: 06.10.23 05:03
Оценка:
Здравствуйте, Кодт, Вы писали:


К>В принципе, смысл этого понятен: еслм мы делаем что-то содержательное в деструкторе, то семантика copy elision подвергается сомнению. И наверное, надо делать что-то соответствующее в конструкторе копирования (хотя бы и задефолтить его явно).


То есть, они сломали десятилетия кода с интерфейсами (абстрактный класс)? Или если интерфейс pure virtual, тогда предупреждения нет?
Re[4]: warning C5267: definition of implicit copy constructor for '
От: Кодт Россия  
Дата: 06.10.23 11:45
Оценка:
Здравствуйте, flаt, Вы писали:

F>То есть, они сломали десятилетия кода с интерфейсами (абстрактный класс)? Или если интерфейс pure virtual, тогда предупреждения нет?


Сломали, уродцы.
https://godbolt.org/z/zEKTfGbs6
Перекуём баги на фичи!
Re: warning C5267: definition of implicit copy constructor for '
От: reversecode google
Дата: 06.10.23 11:57
Оценка: 1 (1)
на самом деле здесь вылезает другая проблема
это введение в плюсы понятие интерфейса
и вроде даже был пропозал
но где то потерялся и забылся в коммитете
хз почему

у меня есть несколько другой кейс
struct If //вот здесь бы 'interface If' применить
{
virtual void call() = 0;
};

struct MainIf final : public If
{
    ~MainIf(){}
    virtual void call() override {}
    static MainIf & getIf()
    {
         static MainIf instance;
         return instance;
    }

};


и вот мс при определенных полезных включенных ворнингах предупреждает на то что отсутсвует деструктор в базовом классе

а мне он и даром ненужен
я не удаляю ничего по базовому указателю

думал очередной раз полухина понапрягать
но смотрю там у них совсем тишина не реагируют
так что .....
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.