Конструктор копирования и explicit

136
25 апреля 2018, 06:25

Имеется класс Koords и конструктор копирования для него:

Koords();
Koords(Koords &, unsigned = 0, unsigned = 0);

При этом если объявляю его как explicit, то перестает работать возврат Koords в функции, типа:

Koords fun()
{
     return Koords{};
}

компилятор пишет, что нет подходящего конструктора.. Но какого? Конструктор копирования есть и у него есть Koords & в первом аргументе, так что вроде никаких преобразований и быть не должно. Но мне компилятор говорит обратное...

Answer 1
  • Очевидно у вас в классе есть поля и не установлен инвариант по умолчанию. Потому у вас ошибка: нет соответствующей функции для вызова в Koords :: Koords(){}
  • Ваш конструктор коопирования компилятор не воспринимает как конструктор коопирования, во избежании бесконечного цикла коопирования (отсутствует спецификатор const). Компилятор может считать это просто как неопределенный конструктор и сообщить, что это неверная инициализация из rvalue типа 'Koords'.

    Это уже вторая ошибка.

Я напишу как надо:

class Koords{    
public:
    Koords() {}
    Koords(const Koords &, unsigned = 0, unsigned = 0);
};

теперь вы можете спокойно возвращать обьект с инициализатором по умолчанию. explicit для коструктора коопирования?.. Когда вы пишете конструктор коопирования, вы и так явно коопируете.. (Хотя это не относится к ответу на вопрос)

Koords fun()
{
     return Koords{};
}

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

READ ALSO
Макрос __func__

Макрос __func__

Переношу проект на более старые зависимости для поддержки более старых ОС, начиная с Windows 7、но тут появляется проблема при переносе, в 2017 версии...

155
Отличия абстрактного класса от интерфейса (abstract class and interface)

Отличия абстрактного класса от интерфейса (abstract class and interface)

Каковы отличия между абстрактным классом и интерфейсом?

158
Найти минимальное число [дубликат]

Найти минимальное число [дубликат]

На данный вопрос уже ответили:

200
JS: Получить html редирект ссылки

JS: Получить html редирект ссылки

Есть ссылка - "https://examplecom"

175