Имеется класс 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{};
}
Если не будете писать конструктор, то как инициализировать ваш обьект, компилятор не знает. Придется возвращать просто неинициализированный обьект, заменяя фигурные скобки на круглые. Надеюсь вы понели, хотя никогда не буду утверждать, что умею хорошо обяснять
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости