Имеется класс Koords
и конструктор копирования для него:
Koords();
Koords(Koords &, unsigned = 0, unsigned = 0);
При этом если объявляю его как explicit
, то перестает работать возврат Koords
в функции, типа:
Koords fun()
{
return Koords{};
}
компилятор пишет, что нет подходящего конструктора.. Но какого? Конструктор копирования есть и у него есть Koords &
в первом аргументе, так что вроде никаких преобразований и быть не должно. Но мне компилятор говорит обратное...
Koords :: Koords(){}
Ваш конструктор коопирования компилятор не воспринимает как
конструктор коопирования, во избежании бесконечного цикла
коопирования (отсутствует спецификатор const
). Компилятор может
считать это просто как неопределенный конструктор и сообщить, что это
неверная инициализация из rvalue типа 'Koords'
.
Это уже вторая ошибка.
Я напишу как надо:
class Koords{
public:
Koords() {}
Koords(const Koords &, unsigned = 0, unsigned = 0);
};
теперь вы можете спокойно возвращать обьект с инициализатором по умолчанию. explicit для коструктора коопирования?
.. Когда вы пишете конструктор коопирования, вы и так явно коопируете.. (Хотя это не относится к ответу на вопрос)
Koords fun()
{
return Koords{};
}
Если не будете писать конструктор, то как инициализировать ваш обьект, компилятор не знает. Придется возвращать просто неинициализированный обьект, заменяя фигурные скобки на круглые. Надеюсь вы понели, хотя никогда не буду утверждать, что умею хорошо обяснять
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Переношу проект на более старые зависимости для поддержки более старых ОС, начиная с Windows 7、но тут появляется проблема при переносе, в 2017 версии...
Каковы отличия между абстрактным классом и интерфейсом?