Re[7]: Копирование базовых подо
От: Bork СССР  
Дата: 13.08.04 04:11
Оценка:
Здравствуйте, sergey_shandar, Вы писали:

_>См. пример внимательно:

_>
_>struct C;
_>struct B
_>{
_>    B() {}
_>    B(const B &) { std::cout << "copy constructor" << std::endl; }
_>    B(const C &) { std::cout << "[cencored] constructor" << std::endl; }
_>};
_>struct C: B {}; ///< строка 8.
_>


_>В строке 8 компилятор должен создавать правильный "The implicitly-defined copy constructor", который должен вызывать для каждого "of its subobjects" "the copy constructor", т.е. B::B(const B &). А вызываеться B(const C &), т.е. бред какой то, ч.т.д.


это с какой такой великой радости он это должен ?
в строке 8 компилятор должен создаеть такое:

<псевдокод>
C(const C&)
{
B(C) — конструирование базового класса
С(С) — конструирование инстанцируемого класса
}

что он и делает. если бы не был определен конструктор B(const C&), то компилятор бы сделал дополнительную функцию для приведения типа и вызов бы был таким:

<псевдокод>
C(const C&)
{
operator B(const C&) — оператор приведения типа
B(operator B(C)) — конструирование базового класса
С(С) — конструирование инстанцируемого класса
}

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