warning C5267: definition of implicit copy constructor for 'i_base' is deprecated because it has a user-provided destructor
* (фактическое имя класса тут заменил на i_base)
Чтобы устранить warning я прислал автору проекта фикс патч, где определил конструкторы в интерфейсе (базовый класс)
(раскоментировать 3 строчки)
На что он мне ответил:
а зачем в интерфейсе с чисто виртуальными методами конструкторы?
Так мой фикс — норм решение, или как лучше сделать?
Вроде логично, чтобы в наследнике были конструкторы мув и копи по умолчанию — они должны быть таковыми и в базе.
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;
}
В принципе, смысл этого понятен: еслм мы делаем что-то содержательное в деструкторе, то семантика copy elision подвергается сомнению. И наверное, надо делать что-то соответствующее в конструкторе копирования (хотя бы и задефолтить его явно).
Base test() {
Base one;
return one;
}
Перекуём баги на фичи!
Re[3]: warning C5267: definition of implicit copy constructor for '
К>В принципе, смысл этого понятен: еслм мы делаем что-то содержательное в деструкторе, то семантика copy elision подвергается сомнению. И наверное, надо делать что-то соответствующее в конструкторе копирования (хотя бы и задефолтить его явно).
То есть, они сломали десятилетия кода с интерфейсами (абстрактный класс)? Или если интерфейс pure virtual, тогда предупреждения нет?
Re[4]: warning C5267: definition of implicit copy constructor for '
Здравствуйте, flаt, Вы писали:
F>То есть, они сломали десятилетия кода с интерфейсами (абстрактный класс)? Или если интерфейс pure virtual, тогда предупреждения нет?
на самом деле здесь вылезает другая проблема
это введение в плюсы понятие интерфейса
и вроде даже был пропозал
но где то потерялся и забылся в коммитете
хз почему
у меня есть несколько другой кейс
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;
}
};
и вот мс при определенных полезных включенных ворнингах предупреждает на то что отсутсвует деструктор в базовом классе
а мне он и даром ненужен
я не удаляю ничего по базовому указателю
думал очередной раз полухина понапрягать
но смотрю там у них совсем тишина не реагируют
так что .....