
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.21] |
![]() |
|
Страницы: (78) « Первая ... 43 44 [45] 46 47 ... 77 78 ( Перейти к последнему сообщению ) |
Сообщ.
#661
,
|
|
|
Я про то, которое именно для набора текста было предназначено. Даже на терминалах бывало не было тех же фигурных скобок. не уверен, что они вообще в той кодировке были.
|
Сообщ.
#662
,
|
|
|
У меня глупый вопрос. Будет ли вызван деструктор:
![]() ![]() 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; } |
Сообщ.
#663
,
|
|
|
![]() ![]() SomeType() : SomeType(42) { throw "aaa"; } Так писать нельзя. SomeType в данном случае не базовый тип и не член. |
Сообщ.
#664
,
|
|
|
Цитата Бобёр @ ![]() ![]() 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: ![]() ![]() 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. |
Сообщ.
#665
,
|
|
|
Ой, .. да, в Новом Стандарте так, оказывается, будет можно, я пропустил этот момент, спасибо.
![]() Этой штуки давно не хватало, кстати ![]() |
Сообщ.
#666
,
|
|
|
Цитата Бобёр @ Этой штуки давно не хватало, кстати ![]() Но ситуация с исключением и вызовом деструктора не столь гладкая, ибо добавилось обстоятельство, при котором в случае исключения в конструкторе объекта вызывается его же деструктор. Раньше такого не могло быть в принципе... |
Сообщ.
#667
,
|
|
|
Цитата D_KEY @ Будет ли вызван деструктор: наверное есть какой-то принцип не позволяющий скачать компилятор? ![]() ![]() #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; } } ![]() ![]() C:\test>g++ -std=c++0x delegat.cpp -odelegat C:\test>delegat ~SomeType() catching exception C:\test> |
Сообщ.
#668
,
|
|
|
Цитата niXman @ наверное есть какой-то принцип не позволяющий скачать компилятор? Сейчас еще не наступила та стадия поддержки стандарта, чтобы проверять подобные вещи компиляторами ![]() |
Сообщ.
#669
,
|
|
|
Цитата D_KEY @ еще не наступила та стадия поддержки стандарта, чтобы проверять подобные вещи компиляторами тебе походу виднее, не то что разработчикам. Добавлено скажи, как определил что в данном случае стадия не та? Добавлено не придирка. просто любопытно, чем ты руководствуешься. |
Сообщ.
#670
,
|
|
|
Цитата niXman @ тебе походу виднее, не то что разработчикам. ![]() Виднее Стандарту. Я не имел возможности искать этот момент там, потому и спросил - вдруг кто уже этот момент для себя прояснил. Как добрался до стандарта - нашел. Цитата скажи, как определил что в данном случае стадия не та? (1) Стандарт поддерживается не полностью, (2) есть известные баги компилятора при работе с фичами нового стандарта. |
Сообщ.
#671
,
|
|
|
изначально был просто вопрос, без заднего смысла. но судя по ответам, ты посчитал эти вопросы придирками.
забудь... |
Сообщ.
#672
,
|
|
|
Цитата niXman @ но судя по ответам, ты посчитал эти вопросы придирками. забудь... Да вроде нет - ответил же ![]() |
Сообщ.
#673
,
|
|
|
D_KEY, если кратко - можно просто посмотреть набор тестов для delegating constructors. и основываясь на выводах сделанных из тестов, можно понять больше чем тебе ответят на форуме.
|
Сообщ.
#674
,
|
|
|
вопрос теперь в том, как в деструкторе отличить, какие конструкторы успели отработать
![]() |
Сообщ.
#675
,
|
|
|
Цитата niXman @ D_KEY, если кратко - можно просто посмотреть набор тестов для delegating constructors. и основываясь на выводах сделанных из тестов, можно понять больше чем тебе ответят на форуме. Как думаешь, если у меня не нашлось времени, чтобы полистать стандарт, нашлось бы оно для поиска и просмотра тестов? А от стандарта толку явно больше. Добавлено Цитата Radagast @ вопрос теперь в том, как в деструкторе отличить, какие конструкторы успели отработать ![]() Вот и я теперь думаю... Собственно, вопрос вырос из холивара, где мне припомнили, что я ругал Delphi за вызов деструктора в случае исключения в конструкторе(у них так происходит всегда) ![]() Но думаю, что на практике, все будет более-менее нормально. |