Хитрый деструктор
, Или непонятнки со стандартом
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.14] |
|
|
Хитрый деструктор
, Или непонятнки со стандартом
|
Сообщ.
#1
,
|
|
|
|
ОС: Любая
Компилятор: Любой Народ жаловался, что нет интересных вопросов. Попробую исправить эту ситуацию. Вот код: ![]() ![]() #include <iostream> struct B { ~B() {std::cout << "B::~B" << std::endl;} }; struct D : B { }; D::~D() {std::cout << "D::~D" << std::endl;} int main() { D d; } Внимание, вопрос. Как отнесется к этому коду ваш любимый компилятор? И насколько реакция вашего компилятора соответствует стандарту? |
|
Сообщ.
#2
,
|
|
|
|
6-ка матерится при компиляции
|
|
Сообщ.
#3
,
|
|
|
|
Lucifer, попробуй на 7.1
А потом обоснуй результат. |
|
Сообщ.
#4
,
|
|
|
|
Цитата Flex Ferrum @ Lucifer, попробуй на 7.1 А потом обоснуй результат. 7.1 нихт. В ней откомпилится? |
|
Сообщ.
#5
,
|
|
|
|
Цитата Lucifer @ 7.1 нихт. В ней откомпилится? Я пока обожду с ответом на этот вопрос.... |
|
|
|
|
|
7ёрка компилит. ерроров нет.
7ёрка рулит. она круче 6ёрки!!! Я победил? Приз в студию!!! УРА-УРА!!! |
|
Сообщ.
#7
,
|
|
|
|
definition of implicitly-declared `D::~D()' (g++ 2.95.3)
|
|
Сообщ.
#8
,
|
|
|
|
Имеем:
Цитата D::~D B::~B Все правильно! Если ты о return, то ето на совести разработчиков компилятора. Для "пустого" класса будет выделен 1 байт Добавлено Цитата XE-XE @ definition of implicitly-declared `D::~D()' (g++ 2.95.3) В стандарте сказано, что конструкторы (копирования) и т.п., если их нет создаются компилятром. |
|
Сообщ.
#9
,
|
|
|
|
VC7.1 компилит, результат изложен выше.
Intel C++ ругается: Цитата error: defining an implicitly declared member function is not allowed D::~D() {std::cout << "D::~D" << std::endl;} |
|
Сообщ.
#10
,
|
|
|
|
byte, это значит токо, что разработчики Intel C++ не очень читали стандарт!
В стандарте сказано, что конструкторы (копирования) и т.п., если их нет должны создаваться самим компилятром. |
|
Сообщ.
#11
,
|
|
|
|
Шерлок Холмс, дык вот в чем прикол-то. Деструктор не объявлен, но определен. И вопрос в том, как должен вести себя компилятор?
Роюсь в стандарте.. |
|
Сообщ.
#12
,
|
|
|
|
ну, допустим компилятор не нашел объявление ~D(); и создал его, а потом нашел тело (твоей ~D()) этого деструктора и скомпилил.
|
|
Сообщ.
#13
,
|
|
|
|
Шерлок Холмс, я примерно понимаю, что происходит
![]() Но лично мне было бы интересней знать не то, как ведет себя компилятор, а почему он ведет себя так и как должен себя вести. Поэтому и надо посмотреть в стандарте. Тем более раз поведения различных компиляторов различны. Добавлено Flex Ferrum, Цитата Programs shall not define implicitly-declared special member functions. (начало главы 12 в стандарте) То есть нельзя определять неявно объявленные специальные функции-члены класса(надеюсь, понятно, какие) Цитата If a class has no user-declared destructor, a destructor is declared implicitly. (12.4.3) То есть если мы не объявляем деструктор явно, компилятор делает это за нас. Ты не объявляешь для структуры D деструктор явно => это делает компилятор. То есть ты получаешь "implicitly-declared special member function". А их нельзя определять явно. То есть, грубо говоря, приведенная тобой программа ill-formed. Добавлено Следовательно, поведение Intel'овского компилятора и g++ оправдано, а VC - нет. |
|
Сообщ.
#14
,
|
|
|
|
Да, а вот начало раздела 12 я не прочитал... VC "исправляется" если убрать наследование. Значит, баг в компиляторе... Хотя и весьма интересный.
|
|
Сообщ.
#15
,
|
|
|
|
Цитата Flex Ferrum @ VC "исправляется" если убрать наследование. это я тоже заметил ![]() Цитата Flex Ferrum @ Значит, баг в компиляторе... По идее о багах компилера надо сообщать разработчикам? Видел, как на RSDN'е это делается: кто-то пишет bug report, MS-овцы на него отвечают, собираются ли править и тд.. Может сообщить им? Может кто-то уже имел дело с этим? |
|
Сообщ.
#16
,
|
|
|
|
Цитата byte @ По идее о багах компилера надо сообщать разработчикам? Ну да. Если компилятор не нашел ошибок в вашей программе - сообщите разработчикам. Они найдут ошибки в компиляторе. Старая программерская поговорка. |
|
Сообщ.
#17
,
|
|
|
|
BCB.
[C++ Error] Unit1.cpp(19): E2171 Body has already been defined for function 'D::~D()' |
|
Сообщ.
#18
,
|
|
|
|
Цитата ---------- Compile with bcc55 ---------- Borland C++ 5.5 for Win32 Copyright © 1993, 2000 Borland C:\Downloads\Docs\123456\123.cpp: Error E2171 C:\Temp\123456\123.cpp 12: Body has already been defined for function 'D::~D()' *** 1 errors in Compile *** Output completed (1 sec consumed) - Normal Termination |