На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (78) « Первая ... 43 44 [45] 46 47 ...  77 78  ( Перейти к последнему сообщению )  
> Текущий Стандарт С++ и перспективы его развития
    Я про то, которое именно для набора текста было предназначено. Даже на терминалах бывало не было тех же фигурных скобок. не уверен, что они вообще в той кодировке были.
      У меня глупый вопрос. Будет ли вызван деструктор:
      ExpandedWrap disabled
        class SomeType  {
            int number;
         
        public:
            SomeType(int new_number) : number(new_number) {}
            SomeType() : SomeType(42) { throw "aaa"; }
            ~SomeType() { std::cout << "~SomeType()" << std::endl; }
        };
         
        // ...
         
        {
            SomeType x;
        }
        ExpandedWrap disabled
          SomeType() : SomeType(42) { throw "aaa"; }

        Так писать нельзя. SomeType в данном случае не базовый тип и не член.
        Сообщение отредактировано: Бобёр -
          Цитата Бобёр @
          ExpandedWrap disabled
            SomeType() : SomeType(42) { throw "aaa"; }

          Так писать нельзя. SomeType в данном случае не базовый тип и не член.

          Бобер, тема о новом стандарте, если ты не заметил.

          Цитата 12.6.2/6
          A mem-initializer-list can delegate to another constructor of the constructor’s class using any class-or-
          decltype that denotes the constructor’s class itself. If a mem-initializer-id designates the constructor’s class,
          it shall be the only mem-initializer; the constructor is a delegating constructor, and the constructor selected
          by the mem-initializer is the target constructor. The principal constructor is the first constructor invoked
          in the construction of an object (that is, not a target constructor for that object’s construction). The
          target constructor is selected by overload resolution. Once the target constructor returns, the body of the
          delegating constructor is executed. If a constructor delegates to itself directly or indirectly, the program is
          ill-formed; no diagnostic is required. [ Example:
          ExpandedWrap disabled
            struct C {
              C( int ) { }                // #1: non-delegating constructor
              C(): C(42) { }              // #2: delegates to #1
              C( char c ) : C(42.0) { }   // #3: ill-formed due to recursion with #4
              C( double d ) : C(’a’) { }  // #4: ill-formed due to recursion with #3
            };

          — end example ]


          Добавлено
          Да, будет:
          Цитата 15.2/2
          An object of any storage duration whose initialization or destruction is terminated by an exception will
          have destructors executed for all of its fully constructed subobjects (excluding the variant members of a
          union-like class), that is, for subobjects for which the principal constructor (12.6.2) has completed execution
          and the destructor has not yet begun execution. Similarly, if the non-delegating constructor for an object
          has completed execution and a delegating constructor for that object exits with an exception, the object’s
          destructor will be invoked.
          If the object was allocated in a new-expression, the matching deallocation
          function (3.7.4.2, 5.3.4, 12.5), if any, is called to free the storage occupied by the object.
          Сообщение отредактировано: D_KEY -
            Ой, .. да, в Новом Стандарте так, оказывается, будет можно, я пропустил этот момент, спасибо. :whistle:
            Этой штуки давно не хватало, кстати :yes:
              Цитата Бобёр @
              Этой штуки давно не хватало, кстати :yes:

              Но ситуация с исключением и вызовом деструктора не столь гладкая, ибо добавилось обстоятельство, при котором в случае исключения в конструкторе объекта вызывается его же деструктор. Раньше такого не могло быть в принципе...
                Цитата D_KEY @
                Будет ли вызван деструктор:

                наверное есть какой-то принцип не позволяющий скачать компилятор?

                ExpandedWrap disabled
                  #include <iostream>
                   
                  class SomeType  {
                      int number;
                   
                  public:
                      SomeType(int new_number) : number(new_number) {}
                      SomeType() : SomeType(42) { throw "aaa"; }
                      ~SomeType() { std::cout << "~SomeType()" << std::endl; }
                  };
                   
                  int main() {
                     try {
                        SomeType st;
                     } catch ( ... ) {
                        std::cout << "catching exception" << std::endl;
                     }
                  }

                ExpandedWrap disabled
                  C:\test>g++ -std=c++0x delegat.cpp -odelegat
                   
                  C:\test>delegat
                  ~SomeType()
                  catching exception
                   
                  C:\test>
                  Цитата niXman @
                  наверное есть какой-то принцип не позволяющий скачать компилятор?

                  Сейчас еще не наступила та стадия поддержки стандарта, чтобы проверять подобные вещи компиляторами :)
                    Цитата D_KEY @
                    еще не наступила та стадия поддержки стандарта, чтобы проверять подобные вещи компиляторами

                    тебе походу виднее, не то что разработчикам.

                    Добавлено
                    скажи, как определил что в данном случае стадия не та?

                    Добавлено
                    не придирка. просто любопытно, чем ты руководствуешься.
                    Сообщение отредактировано: niXman -
                      Цитата niXman @
                      тебе походу виднее, не то что разработчикам.

                      :wacko:
                      Виднее Стандарту. Я не имел возможности искать этот момент там, потому и спросил - вдруг кто уже этот момент для себя прояснил. Как добрался до стандарта - нашел.

                      Цитата
                      скажи, как определил что в данном случае стадия не та?

                      (1) Стандарт поддерживается не полностью, (2) есть известные баги компилятора при работе с фичами нового стандарта.
                        изначально был просто вопрос, без заднего смысла. но судя по ответам, ты посчитал эти вопросы придирками.
                        забудь...
                          Цитата niXman @
                          но судя по ответам, ты посчитал эти вопросы придирками.
                          забудь...

                          Да вроде нет - ответил же :)
                            D_KEY, если кратко - можно просто посмотреть набор тестов для delegating constructors. и основываясь на выводах сделанных из тестов, можно понять больше чем тебе ответят на форуме.
                              вопрос теперь в том, как в деструкторе отличить, какие конструкторы успели отработать :(
                                Цитата niXman @
                                D_KEY, если кратко - можно просто посмотреть набор тестов для delegating constructors. и основываясь на выводах сделанных из тестов, можно понять больше чем тебе ответят на форуме.

                                Как думаешь, если у меня не нашлось времени, чтобы полистать стандарт, нашлось бы оно для поиска и просмотра тестов?
                                А от стандарта толку явно больше.

                                Добавлено
                                Цитата Radagast @
                                вопрос теперь в том, как в деструкторе отличить, какие конструкторы успели отработать :(

                                Вот и я теперь думаю...
                                Собственно, вопрос вырос из холивара, где мне припомнили, что я ругал Delphi за вызов деструктора в случае исключения в конструкторе(у них так происходит всегда) :D

                                Но думаю, что на практике, все будет более-менее нормально.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (78) « Первая ... 43 44 [45] 46 47 ...  77 78


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0966 ]   [ 16 queries used ]   [ Generated: 20.06.25, 17:21 GMT ]