На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Хитрый деструктор , Или непонятнки со стандартом
    ОС: Любая
    Компилятор: Любой

    Народ жаловался, что нет интересных вопросов. Попробую исправить эту ситуацию.
    Вот код:
    ExpandedWrap disabled
      #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;
      }

    Внимание, вопрос.
    Как отнесется к этому коду ваш любимый компилятор? И насколько реакция вашего компилятора соответствует стандарту?
    Сообщение отредактировано: Flex Ferrum -
      6-ка матерится при компиляции
        Lucifer, попробуй на 7.1 :) А потом обоснуй результат.
          Цитата Flex Ferrum @
          Lucifer, попробуй на 7.1 А потом обоснуй результат.

          7.1 нихт. В ней откомпилится?
            Цитата Lucifer @
            7.1 нихт. В ней откомпилится?

            Я пока обожду с ответом на этот вопрос....
              7ёрка компилит. ерроров нет.

              7ёрка рулит. она круче 6ёрки!!! 8-)

              Я победил? Приз в студию!!! УРА-УРА!!! :D
              Сообщение отредактировано: FlatBug -
                definition of implicitly-declared `D::~D()' (g++ 2.95.3)
                  Имеем:
                  Цитата

                  D::~D
                  B::~B


                  Все правильно!
                  Если ты о return, то ето на совести разработчиков компилятора. Для "пустого" класса будет выделен 1 байт

                  Добавлено
                  Цитата XE-XE @
                  definition of implicitly-declared `D::~D()' (g++ 2.95.3)

                  В стандарте сказано, что конструкторы (копирования) и т.п., если их нет создаются компилятром.
                    VC7.1 компилит, результат изложен выше.
                    Intel C++ ругается:
                    Цитата
                    error: defining an implicitly declared member function is not allowed
                    D::~D() {std::cout << "D::~D" << std::endl;}
                      byte, это значит токо, что разработчики Intel C++ не очень читали стандарт!
                      В стандарте сказано, что конструкторы (копирования) и т.п., если их нет должны создаваться самим компилятром.
                        Шерлок Холмс, дык вот в чем прикол-то. Деструктор не объявлен, но определен. И вопрос в том, как должен вести себя компилятор?
                        Роюсь в стандарте.. :rolleyes:
                          ну, допустим компилятор не нашел объявление ~D(); и создал его, а потом нашел тело (твоей ~D()) этого деструктора и скомпилил.
                            Шерлок Холмс, я примерно понимаю, что происходит :)
                            Но лично мне было бы интересней знать не то, как ведет себя компилятор, а почему он ведет себя так и как должен себя вести.
                            Поэтому и надо посмотреть в стандарте. Тем более раз поведения различных компиляторов различны.

                            Добавлено
                            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 - нет.
                            Сообщение отредактировано: byte -
                              Да, а вот начало раздела 12 я не прочитал... VC "исправляется" если убрать наследование. Значит, баг в компиляторе... Хотя и весьма интересный.
                                Цитата Flex Ferrum @
                                VC "исправляется" если убрать наследование.

                                :yes: это я тоже заметил :)

                                Цитата Flex Ferrum @
                                Значит, баг в компиляторе...

                                По идее о багах компилера надо сообщать разработчикам? :rolleyes: Видел, как на RSDN'е это делается: кто-то пишет bug report, MS-овцы на него отвечают, собираются ли править и тд.. Может сообщить им? Может кто-то уже имел дело с этим?
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0379 ]   [ 15 queries used ]   [ Generated: 29.03.26, 19:57 GMT ]