Здравствуйте, Кодт, Вы писали:
К>Может, всё-таки ты объяснишь, какая задача перед тобой стоит?
Можно назвать это рефакторингом. Класс уже юзается и неявно инициализируется временным объектом (через равно). И это вполне допустимо, и не хочется терять такое поведение. Но я осознал опасность неявного создание класса, из-за его специфики, при инициализации аргументов функции. Теперь хочу запретить такое неявное поведение во избежании дальнейших ошибок.
Здравствуйте, Bell, Вы писали:
B>Компиляторы VC (с уверенностью могу сказать про VC6, VC7.1), однако, игнорируют это требование. B>Например, если в примере выше объявить конструктор копирования test::test(const test&) закрытым, то VC все равно скомпилирует пример, котя по стандарту не должен.
Я так понимаю, неявное создание компилятором объекта приватного класса тоже подпадает под эту особенность?
Здравствуйте, Were, Вы писали:
W>Здравствуйте, Bell, Вы писали:
B>>Компиляторы VC (с уверенностью могу сказать про VC6, VC7.1), однако, игнорируют это требование. B>>Например, если в примере выше объявить конструктор копирования test::test(const test&) закрытым, то VC все равно скомпилирует пример, котя по стандарту не должен.
W>Я так понимаю, неявное создание компилятором объекта приватного класса тоже подпадает под эту особенность?
Конечно.
Здравствуйте, Were, Вы писали:
W>Можно назвать это рефакторингом. Класс уже юзается и неявно инициализируется временным объектом (через равно). И это вполне допустимо, и не хочется терять такое поведение. Но я осознал опасность неявного создание класса, из-за его специфики, при инициализации аргументов функции. Теперь хочу запретить такое неявное поведение во избежании дальнейших ошибок.
Ну, если невозможно навязать пользователям стиль
void function( CRef<YourClass> );
то остаётся путь кровавого рефакторинга: вносишь изменение, гарантированно ломающее компиляцию, и несложным способом подчищаешь все места ошибок.
Два варианта:
1) Объявить конструктор явным, а для удобства — см. фокус с approved.
2) Определить пару классов, один с неявным конструктором — для уже имеющегося кода, а второй с явным — для грядущего. Естественно, с общей реализацией (например, унаследовать один от другого). Заменить все вхождения исходного класса на класс с неявным конструктором. На публику же отдать класс с явным конструктором.