Всем добрый день!
Кто-нибудь из экспертов может объяснить что тут происходит и почему данный код компилируется ?
В двух словах: есть базовый класс с запрещенным конструктором копирования, наследник от него со своим конструктором копирования вызывает не конструктор базового, а конструктор по-умолчанию. Так и должно быть?
Re: Запрет конструктора копирования в базовом классе
Здравствуйте, Videoman, Вы писали:
V>В двух словах: есть базовый класс с запрещенным конструктором копирования, наследник от него со своим конструктором копирования вызывает не конструктор базового, а конструктор по-умолчанию. Так и должно быть?
конструктор копирования написан явно:
Test(const Test& other) : m_val(other.m_val) {}
и там нет попытки вызвать приватный конструктор из базового класса
паттерн noncopyable используют чаще против неявного копирования, то есть когда конструктор копии для класса Test не написан явно
смотрим: https://ideone.com/HReM1O
Re[2]: Запрет конструктора копирования в базовом классе
Здравствуйте, uzhas, Вы писали:
U>и там нет попытки вызвать приватный конструктор из базового класса
там нет и попытки вызвать конструктор по умолчанию, а он вызывается
U>паттерн noncopyable используют чаще против неявного копирования, то есть когда конструктор копии для класса Test не написан явно U>смотрим: https://ideone.com/HReM1O
Т.е. мой случай никак обезопасить нельзя, может модно что-нибудь добавить?
Re: Запрет конструктора копирования в базовом классе
Здравствуйте, Videoman, Вы писали:
V>Всем добрый день! V>Кто-нибудь из экспертов может объяснить что тут происходит и почему данный код компилируется ?
V>В двух словах: есть базовый класс с запрещенным конструктором копирования, наследник от него со своим конструктором копирования вызывает не конструктор базового, а конструктор по-умолчанию. Так и должно быть?
Насколько я понимаю, да, так и должно быть. Базовый конструктор (копирования) не вызывается автоматически, имхо все нормально.
Здравствуйте, Videoman, Вы писали:
V> там нет и попытки вызвать конструктор по умолчанию, а он вызывается
конструктор по-умолчанию для того и нужен, чтобы вызываться, когда не вызывается какой-либо другой конструктор
V>Т.е. мой случай никак обезопасить нельзя, может модно что-нибудь добавить?
поясните, что значит "обезопасить"?
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Здравствуйте, Videoman, Вы писали:
V>Здравствуйте, uzhas, Вы писали:
U>>и там нет попытки вызвать приватный конструктор из базового класса
V> там нет и попытки вызвать конструктор по умолчанию, а он вызывается
В своем коде ты явно создаешь конструктор копирования:
Test(const Test& other) : m_val(other.m_val) {} // <== Здесь вызывается конструктор предка по умолчанию, он protected и доступ к нему не запрещен
Если конструктор копирования явно не указывать, то компилятор создаст его самостоятельно, и будет выглядеть он как следующий псевдокод:
Test(const Test& other)
: noncopyable(other)// Сначала копируется предок, а его конструктор копирования - private => ошибка компиляции
, m_val(other.m_val)
{}
Таким образом копирования объектов предка также оказывается запрещенным.
U>>паттерн noncopyable используют чаще против неявного копирования, то есть когда конструктор копии для класса Test не написан явно U>>смотрим: https://ideone.com/HReM1O
V>Т.е. мой случай никак обезопасить нельзя, может модно что-нибудь добавить?
А собственно, от чего ты хочешь защититься? Наследник явно разрешает копирование его объектов, так как в нем явно определен конструктор копирования.
Re[3]: Запрет конструктора копирования в базовом классе
Здравствуйте, Videoman, Вы писали:
V>Т.е. мой случай никак обезопасить нельзя, может модно что-нибудь добавить?
Я правильно понял, ты хочешь, чтобы экземпляр класса нельзя было копировать, но при этом добавляешь конструктор копирования? А зачем?
Нет, если уж очень хочется, то делай правильно:
Спасибо большое всем ответившим!
Поскольку встречные вопросы примерно у всех одинаковые, то постараюсь ответить всем одним сообщением.
Проблема была в том, что я нечаянно создал конструктор копирования у класса у которого его не должно быть. По-идее именно от таких случаев и должен спасать noncopyable, а он подвел. Раньше был уверен, что из конструктора копирования, по-умолчанию (если не указывать), вызывается конструктор копирования базового класса. Теперь буду знать что это не так.