|
|
|||||||||||||||||||||||||||||
|
C++11 - removed and deprecatedИсточник: habrahabrru
Все уже в курсе выхода нового стандарта С++11, А я вот решила написать о том, что из С++ в новой версии было исключено и по каким причинам. Оно, может быть, кажется и не таким важным, как новые возможности, но, как говорится: "Тот, кто не знает истории, обречён на повторение ошибок". Dynamic exception specifications Вы, наверное, знаете, что при объявлении функций можно указать, какие типы исключений эта функция будет генерировать. Ну вот как-то так: И казалось бы - всё хорошо, вот только на самом деле: Теперь вся эта чехарда убрана и добавлено одно ключевое слово "noexcept", объясняющее, что функция генерировать исключения не может. И всё. auto_ptr Один из видов умных указателей более не будет радовать нас своим присутствием в С++. auto_ptr убран. Задумка auto_ptr была хорошей, вот только на практике оказалось, что люди абсолютно не читают документацию. И хотя на счёт auto_ptr чётко сказано, что его нельзя использовать, например, с STL-коллекциями, все постоянно это делали. А самое плохое, что это приводило к неопределённым результатам. Например, вот такой вот код: В зависимости от компилятора, ОС, версии STL и фазы луны может работать, не работать или даже вовсе падать. Комитет по стандартизации С++ отчаялся взывать к разуму и заменил auto_ptr на unique_ptr, который в проблемных для auto_ptr случаях ведёт себя вполне определённым образом: либо работает, либо не компилируется. Я думаю, все согласятся, что это значительно более предпочтительное поведение. Понятие "точка следования" О точках следования всегда любили со знанием дела рассуждать любители вопросов "а сколько будет i++ + ++i ?". Ранее стандарт С++ определял, какие операции являются точками следования, а какие нет. Теперь понятие упразднено, хотя по сути ничего не изменилось. Все операции всё-равно делятся на гарантирующие последовательность выполнения определённых действий и не гаранитирующие. Теперь говорят просто "операция последовательна" или "операция не последовательна". Объясняется это изменение какими-то призрачными надеждами на упрощение стандартизации новой модели памяти (о чём вообще идёт речь?) и т.д. Мне кажется - вранье. Просто "точка следования" звучало как-то сильно сложно. :) Экспорт шаблонов Я думаю, мало кто знал или использовал эту фичу. Вот пример: static void trace() { printf("File 1\n"); } // declaration only int main() { // File 2: static void trace() { printf("File 2\n"); } //The definition Обратите внимание - в одном файле объявляется шаблонная функция, в другом - реализуется, при этом файлы не включают друг друга и каждый имеет собственную версию функции trace(). Больше по этой теме можно почитать тут. Компания Edison Design Group много лет назад настояла на добавлении этой возможности в стандарт. Им она казалась очень важной, они даже сделали реализацию в собственном компиляторе, правда, кроме них этого не сделал больше никто (хотя их разработку, использовала, например, Borland). Прошло время и EDG признали, что ошиблись. Из стандарта С++11 экспорт шаблонов убрали. Удачи всем в изучении нового стандарта, буду очень рада, если статья окажется для кого-то полезной.
|
|