Здравствуйте, so5team, Вы писали:
M>>MSVC2019, С++17
M>>Есть базовый класс, конструктор копирования запрещён.
S>А что с конструктором перемещения в базовом классе?
S>Ну и как бы не видя базового класса это может превратиться в гадание по кофейной гуще.
Здравствуйте, Marty, Вы писали:
M>>>Есть базовый класс, конструктор копирования запрещён.
S>>А что с конструктором перемещения в базовом классе?
S>>Ну и как бы не видя базового класса это может превратиться в гадание по кофейной гуще.
M>
AD>Тыж явно зовешь конструктор копирования/перемещения через make_shared.
Была надежда, что компилер разберётся
Есть варианты ему подсказать, что там не надо копировать, а перемещать? std::move?
AD>Пусть WindowTimerImpl::create сама возвращает shared.
А других вариантов нет?
В принципе, есть конечно вариант обойтись без create, а всё сделать в конструкторе, но тут есть нюанс — в версии std::make_shared, которая есть в MSVC2019, оно не понимает списка аргументов, чтобы его передать в соответствующий конструктор, так что тут всё равно при вызове std::make_shared либо явно указывать конструктор, либо пытаться передать список инициализации, и надеяться, что там унутре обойдётся без копирования как-нибудь.
Функция create возвращает не указатель а экземпляр обьекта.
бедный make_shared которому это дали пытается найти у класса конструктор которому в качестве параметра надо передать экземпляр самого класса и не может.
Re[2]: Отсутствующий конструктор копирования в MSVC2019 вызывает ош
Здравствуйте, Teolog, Вы писали:
T>Функция create возвращает не указатель а экземпляр обьекта. T>бедный make_shared которому это дали пытается найти у класса конструктор которому в качестве параметра надо передать экземпляр самого класса и не может.
M>В принципе, есть конечно вариант обойтись без create, а всё сделать в конструкторе, но тут есть нюанс — в версии std::make_shared, которая есть в MSVC2019, оно не понимает списка аргументов
Вы точно уверены что список аргументов не подходил? Может конструктор был приватным?
Re[4]: Отсутствующий конструктор копирования в MSVC2019 вызывает ош
M>>В принципе, есть конечно вариант обойтись без create, а всё сделать в конструкторе, но тут есть нюанс — в версии std::make_shared, которая есть в MSVC2019, оно не понимает списка аргументов
T>Вы точно уверены что список аргументов не подходил? Может конструктор был приватным?
С коллегой в четыре глаза смотрели, но, возможно, оба облажались. Щас глянул на прототип make_shared — по идее, работать должно, да. Попробую проверить эту идею
M>Почему он хочет копировать, а не перемещать?
А почему он должен хотеть перемещать?
Чтобы перемещение работало надо кучу условий соблюсти и специально пинать ногами.
Возвращать по значению некопируемый класс — это такое себе
Re[2]: Отсутствующий конструктор копирования в MSVC2019 вызывает ош
AD>Тыж явно зовешь конструктор копирования/перемещения через make_shared.
Боюсь, здесь не так все просто. Ведь create возвращает rvalue, соответственно, shared_ptr конструирует WindowTimerImpl через конструктор перемещения, а не копирования.
Вот дистиллированный пример, который показывает, что если в базовых классах с операторами/конструкторами перемещения все OK, то и с make_shared должно быть OK:
#include <memory>
struct base
{
virtual ~base() = default;
base() = default;
base(const base &) = delete;
base & operator=(const base &) = delete;
base(base &&) = default;
base & operator=(base &&) = default;
};
struct derived : public base
{
int a_;
int b_;
derived(int a, int b) : a_{a}, b_{b} {}
[[nodiscard]] static derived create(int a, int b)
{
return { a, b };
}
};
int main()
{
auto d = std::make_shared<derived>(derived::create(0, 1));
return d->a_ + d->b_;
}
В режиме C++17 нормально компилируется и VS2022, и VS2019.
У меня была когда-то похожая проблема, но там в одном из базовых классов затесался член класса с задизейбленными операторами копирования/перемещения. Поэтому компилятор и для наследника их не мог вывести.
Полагаю, у ТС-а что-то похожее. Но уже в самом WindowTimerImpl.
Re[5]: Отсутствующий конструктор копирования в MSVC2019 вызывает ош
M>С коллегой в четыре глаза смотрели, но, возможно, оба облажались. Щас глянул на прототип make_shared — по идее, работать должно, да. Попробую проверить эту идею
По коду глядя WindowTimerImpl конструктор с тремя параметрами а вызывается с 4. Может в таком-же стиле
Re[4]: Отсутствующий конструктор копирования в MSVC2019 вызывает ош
Здравствуйте, Teolog, Вы писали:
M>>Почему он хочет копировать, а не перемещать? T>А почему он должен хотеть перемещать? T>Чтобы перемещение работало надо кучу условий соблюсти и специально пинать ногами. T>Возвращать по значению некопируемый класс — это такое себе
В общем, да, я облажался, std::make_shared нормально работает со списком параметров конструктора
Здравствуйте, Teolog, Вы писали:
M>>С коллегой в четыре глаза смотрели, но, возможно, оба облажались. Щас глянул на прототип make_shared — по идее, работать должно, да. Попробую проверить эту идею
T>По коду глядя WindowTimerImpl конструктор с тремя параметрами а вызывается с 4. Может в таком-же стиле
Мы с коллегой не в этот раз смотрели. Но, видимо, тогда что-то проглядели, и я в этот раз сразу решил, что проблема существует, и не стал использовать список параметров при вызове make_shared.