LINUX.ORG.RU

Опубликован стандарт C++11 (бывший C++0x)

 , ,


0

4

ISO объявила о публикации стандарта C++11. Это первое значительное изменение стандарта с 1998-го года. Вот несколько новых объявленных возможностей:

  • ссылки на временные объекты и семантика переноса (rvalue reference);
  • обобщённые константные выражения (ключевое слово constexpr);
  • внешние шаблоны — возможность запретить компилятору инстанцировать шаблон в единице трансляции (extern template class);
  • ключевое слово auto для задания типа переменной на этапе компиляции;
  • цикл for по коллекции данных;
  • lambda-функции;
  • введена отдельная константа нулевого указателя nullptr;
  • шаблоны с переменным числом параметров (variadic templates);
  • thread-local хранилище, модель памяти с поддержкой потоков;
  • изменения в стандартной библиотеке: включение hash tables, регулярных выражений, smart pointers, элементов синхронизации потоков и т.п.

Полный список новых возможностей с подробным объяснением каждой из них можно посмотреть на http://en.wikipedia.org/wiki/C 11 или же более сжато на русском: http://ru.wikipedia.org/wiki/C 11

Полная поддержка C++11 обещается в GCC 4.7, объем поддержки на текущий момент можно оценить по таблице http://gcc.gnu.org/onlinedocs/libstdc /manual/status.html#status.iso.200x

ISO продает текст стандарта по 352 швейцарских франка ($386), но можно бесплатно скачать, например, его финальный черновик (практически не отличающийся от конечной версии) с сайта рабочей группы: http://www.open-std.org/jtc1/sc22/wg21/

>>> Пресс-релиз

★★

Проверено: maxcom ()

Ответ на: комментарий от AX

> В плюсах есть что-то, что может вызвать зависть? o_O

в плюсах нет, а вот в плюсистах — да

www_linux_org_ru ★★★★★ ()

На плюсах будет еще удобнее писать. Хорошая новость, поздравляю всех плюсистов!!!

Vernat ★★ ()
Ответ на: комментарий от segfault

>Да, точно. Правда, никто не мешает мне и в старом стандарте сделать #define nullPtr (void*)0

Не скомпилится без вороха reinterpret_cast'ов. Это же не Си какой-нибудь.

anonymous ()
Ответ на: комментарий от unsigned

thread-local хранилище, модель памяти с поддержкой потоков

И как это будет работать в ОС без поддержки потоков?

То есть? Конкретная реализация С++11 может не иметь поддержки потоков. В чем проблема с TLS, который превращается в обычные переменные при отсутствии потоков?

Pavval ★★★★★ ()
Ответ на: комментарий от matumba

C# настолько очистился от синтаксического шлака «сипипей», концептуально выровнялся и развился, что костыли++ не просто позади, а тупо колыхающийся и воняющий труп страуса.

Чё, правда? Ну давай, расскажи, как в .Net через ж*пу вкатывали шаблоны и про зоопарк IEnumerable, IEnumerable<T> и подобных.

Pavval ★★★★★ ()
Ответ на: комментарий от Pavval

> Чё, правда? Ну давай, расскажи, как в .Net через ж*пу вкатывали шаблоны и про зоопарк IEnumerable, IEnumerable<T> и подобных.

Тащем-то генерики в .Net реализованы на уровне VM, так что ты тут пальцем мимо ткнул, через жопу - это во всяких жабах, плюсцах и прочих языках с затиранием типов.

anonymous ()
Ответ на: комментарий от anonymous

Тащем-то генерики в .Net реализованы на уровне VM,

Ага, только в .Net 2.0. А коллекции появились сразу и интерфейсы для работы с ними тоже. А теперь имеем зоопарк в стандартных либах.

так что ты тут пальцем мимо ткнул, через жопу - это во всяких жабах,плюсцах и прочих языках с затиранием типов.

Java вообще отдельный вопрос - у меня до сих пор болит лицо от фейспалма при прочтении того, как там шаблоны сделаны (а читал я дохрена лет назад).

Pavval ★★★★★ ()

Буду неоригинален: http://www.freetorg.com.ua/_data/lead/1417/725873i.jpg

Плюсарники по-прежнему пытаются сделать так, чтобы при попытке пользоваться их костылями новички не натыкались на «как, эта свистопердящая фигня не умеет такой простой вещи?»

Жду ANSI C 1x. Черновик вроде адекватен.

Pythonist ()

Годная новость, но «С++» и «lambda-функции» сразу говорит о «тренде» «обсуждения»

AlexVR ★★★★★ ()
Ответ на: комментарий от Pythonist

> Жду ANSI C 1x. Черновик вроде адекватен.

Интересного там мало.

tailgunner ★★★★★ ()
Ответ на: комментарий от tailgunner

Мои любимые GNU-расширения не вошли :(

({эти?;})

Pavval ★★★★★ ()
Ответ на: комментарий от mv

Получается, что 0 в качестве нуль-пойнтера - это special value, который должен поддерживаться рантаймом. Т.е. генерируемый код и рантайм языка должны знать, что если в пойнтере содержится 0, то это нифига не интегральный 0, а специальное значение, равное null.

Не рантаймом, а компилятором. В рантайме null может иметь специфическое для платформы значение:

4.10 [conv.ptr] A null pointer constant is an integral constant expression (expr.const) rvalue of integer type that evaluates to zero. A null pointer constant can be converted to a pointer type; the result is the null pointer value of that type and is distinguishable from every other value of pointer to object or pointer to function type. Two null pointer values of the same type shall compare equal.

УмнО, чо... Такой C++.

Ненужен.

liberte ()
Ответ на: >C++ не нужен от mio

>На чем предлагаете писать десктоп приложения?

посмотрел на самые частые используемые собой приложения, на c++ написан только хромой браузер. Остальное - в основном С, с расширениями на elisp, scheme, perl и всяком прочем. Ну и Stumpwm имеется, который на CL.

lazyklimm ★★★★★ ()
Ответ на: комментарий от aho

> а насчет C99 он не говорил?

Нет, автор пишет только про С++ aka «Си два креста»: первый - на читабельности, второй - на быстродействии.

Просто оставлю это здесь: The Dark Side of C++

rics ()
Ответ на: комментарий от rics

> Нет, автор пишет только про С++

и явно бредит, «Судите сами: выпущен новый стандарт - получаем процент с продажи печатных экземпляров» - С++ один из самых консервативных языков, ему стоит узнать про Java, C#, Python и пр.

aho ()
Ответ на: комментарий от liberte

Ну понятно, надо было стандарт прочитать, а не комментить слухи. Ключевое слово: "evaluates to zero", а не "equals to zero". В «if (ptr)» невалидный ptr будет вычисляться в нуль, даже если на платформе невалидный указатель не равен машинному нулю.

Ахе тоже надо было прочитать стандарт...

mv ★★★★★ ()
Ответ на: комментарий от mv

> Ахе тоже надо было прочитать стандарт...

мвяшка что-то путает ;) или хочешь сказать, что NULL не равен 0?

aho ()

Долой шарп, даёшь си!

anonymous ()
Ответ на: комментарий от aho

мвяшка что-то путает ;) или хочешь сказать, что NULL не равен 0?

Теперь, прочитавши кусок стандарта по наводке liberte, могу заявить: nullptr не обязан быть 0.

mv ★★★★★ ()
Ответ на: комментарий от mv

nullptr это просто литерал, точно так же, как 0.0d — литерал, например. Никого же не удивляет, что 0.0 в переменной типа double не обязан быть представлен всеми нулевыми битами. С нулевым указателем то же самое, но дополнительно определены правила для преобразования из const int 0. nullptr добавили для того, чтобы к нему нельзя было прибавить offset, насколько я понял.

liberte ()
Ответ на: комментарий от lazyklimm

В Gentoo полный список можно посмотреть вот так:

revdep-rebuild -ipL '.*\<libstdc\+\+\.so\>.*'
liberte ()
Ответ на: комментарий от liberte

nullptr добавили для того, чтобы к нему нельзя было прибавить offset, насколько я понял.

Это ещё один шаг к нормальным языкам, у которых объекты вычисляются. Невалидный (aka нулевой) указатель был оторван от машинных констант, и теперь он может быть холодным пивом и голыми бабами, но вычисляться обязан в интегральный ноль. «Вычисляться» тут из лямбда калькулус, лисперы и хаскеллисты понимают, о чём это Страуструп.

Новая важная фича rvalue-to-lvalue, о которой тут почему-то молчат (или я плохо тред просмотрел), тоже из того же калькулуса.

mv ★★★★★ ()

что ж, попробуем как оно в деле. не вижу ничего вроде boost.function в стандартной библиотеке - таки нету, или я просто не заметил? лямбды есть куда сохранять при желании?

jtootf ★★★★★ ()
Ответ на: комментарий от mv

> Невалидный (aka нулевой) указатель был оторван от машинных констант

Причем еще в Си :)

tailgunner ★★★★★ ()
Ответ на: комментарий от tailgunner

Невалидный (aka нулевой) указатель был оторван от машинных констант

Причем еще в Си :)

C99?

mv ★★★★★ ()
Ответ на: комментарий от mv

> C99?

Думаю, еще раньше, но у меня на руках только драфт C99.

tailgunner ★★★★★ ()
Ответ на: комментарий от mv

> Теперь, прочитавши кусок стандарта по наводке liberte, могу заявить: nullptr не обязан быть 0.

да - момент с преобразованиями не знал, каюсь, хоть и был прав, что NULL все-равно по стандарту равен 0, как целое число

aho ()
Ответ на: комментарий от aho

NULL определен, как ((void*)0), т.е. он указатель, а не число. При сравнении NULL == 0, например, NULL не может быть преобразован в int, но int-константа 0 может быть преобразована в void*.

liberte ()
Ответ на: комментарий от tailgunner

Думаю, еще раньше, но у меня на руках только драфт C99.

Странно, почему тогда в прошлый C++ такая фича не попала?

mv ★★★★★ ()
Ответ на: комментарий от mv

Может, она и попала - хз. Я сам удивлся, что в C99 не прописано совпадение значения NULL и представления невалидного указателя в памяти. Хотя Гугл говорит, что это известная фишка.

tailgunner ★★★★★ ()
Ответ на: комментарий от liberte

NULL определен, как ((void*)0), т.е. он указатель, а не число.

The macro NULL is an implementation-defined C++ null pointer constant Possible definitions include 0 and 0L, but not (void*)0.

aho ()
Ответ на: комментарий от liberte

если посмотришь определение для gcc, например, то там #ifdef - для C как раз ((void*)0), а для C++ - 0

aho ()
Ответ на: комментарий от aho

что кстати очевидно - (void*)0 для С++ никак не подходит

aho ()
Ответ на: комментарий от Pavval

> Ага, только в .Net 2.0. А коллекции появились сразу и интерфейсы для работы с ними тоже. А теперь имеем зоопарк в стандартных либах.

Какой зоопарк? Наличие одновременно IEnumerable и IEnumerable<T> позволяет в зависимости от ситуации выбирать самому время диспатча - компайл-тайм или рантайм. Это плюс, а не минус.

anonymous ()
Ответ на: комментарий от rics

> Просто оставлю это здесь: The Dark Side of C++
rics, огромное спасибо за линк. Наконец-то я увидел что-то больше, чем «C++ не нужен». Хоть я и сторонник C++, я все-таки за объективное мнение и за аргументированную критику, так что твой линк был для меня очень познавательным.

Что до The Dark Side of C++ - да, с многим согласен. Но здесь я могу ответить следущее:
1. 90% решается вменяемым программистом, который пишет понятный код и оставляет комментарии. Любой язык станет плохо читаемым если имена переменных идут не далее a, b, c,... форматированию кода не уделяется должное внимание, а про комментарии я уже молчу.
2. Да, сообщения об ошибках в C++ оставляют желать лучшего. Но у меня ни разу не было того, чтобы компилятор сообщил об ошибке и я ее не нашел. Да, соглашусь, что это иногда занимает чуть больше времени.
3. Да, я соглашусь что в C++ больше шансов сделать memory leak или что-то типа того. Но я считаю, что отсутствие соответвующих проверок скорее плюс чем минус - очень часто они не нужны. Или вы будете бранить ассемблер за что что он не делает сборку мусора? Да, С++ - язык высокого уровня, но не превращать же его в бейсик!

Итог: в мире нет ничего идеального, но в C++ больше плюсов чем минусов ;)

P. S. Отправили бы эту книгу разработчикам, авось чего-то сделали бы...

Kroz ★★★★★ ()
Ответ на: комментарий от aho

Я думал, что речь про C, почему-то, но про то, что в C++ он действительно 0, в любом случае забыл.

liberte ()
Ответ на: комментарий от Kroz

Что до The Dark Side of C++ - да, с многим согласен.

Проблема в том, каждый пункт на этих слайдах лишь проходит по касательной по целому пласту возможных проблем. Лично мне по мере прочтения стало физически нехорошо — думаю, я не одинок.

C++ невероятно сложен семантически (взять хотя бы перегрузку функций, или [partial] template specialization), особенно в плане интеракции между разными реализованными в нем парадигмами, и нормально использовать C++ в проекте можно, только если резко ограничить используемые возможности — но тогда зачем он нужен?

Итог: в мире нет ничего идеального, но в C++ больше плюсов чем минусов ;)

Не соглашусь — я не видел ни одного случая, когда использование C++ в проекте было бы оправдано. Понятно, что есть исключения, когда просто нет другого выхода (тот же геймдев), но обычно это: «Нам нужно, чтобы все работало быстро, поэтому будем писать на C++!». Особенно печально, когда в проекте работают студенты (instant fail), но точно так же нет ничего хорошего в огромной и ненужной трате времени профессионалами.

liberte ()
Ответ на: комментарий от liberte

> только если резко ограничить используемые возможности — но тогда зачем он нужен?

в том то и проблема, что достойных аналогов С мало, по сути из того, что можно использовать, есть только С++, если я не прав - покажите плз такие языки, сразу скажу - D пробовал, еще большее изращенство чем С++, при том более неудобное в использовании и более медленное

aho ()
Ответ на: комментарий от aho

Java же, отличный язык. Правда, ресурсоемкий, но для в большинстве проектов это гораздо меньшая проблема, чем сложность и время разработки.

liberte ()
Ответ на: комментарий от liberte

> Java же, отличный язык

возможно, но я не воспринимаю Java как аналог С, они слишком разные

но для в большинстве проектов это гораздо меньшая проблема, чем сложность и время разработки.

как говорил Торвальдс - не надо считать, что инструмент универсален, иначе получится что-то ужасное :) у Java есть своя ниша, а за ее пределами очень мало действительно толкового ПО на ней

aho ()

> lambda-функции

Да-да-да-да-да!

Кстати, а зачем они поменяли название с C++0x на C++11? Типа потому что запаблишили позже, чем планировалось, в 2011м? Эх. Я-то думал, что в C++0x тайный намёк на шестнадцатиричные числа.

powerpc ()
Ответ на: комментарий от rics

Хоть кто-то оставил пост с нормальным аргументом, лор со своими «не нужно» так печалит меня. Спасибо, очень интересно.

world ()
Ответ на: комментарий от Kroz

После прочтения соглашусь с написанным и добавлю немножко от себя: если у вас есть набор инструментов, то вовсе не обязательно использовать его весь при любом виде работ.

world ()
Ответ на: комментарий от ugoday

> Алгоритм Хиндли-Милнера не заменяет мозг и всяким инструментом нужно уметь пользоваться. Сюрприз?

Честно говоря, я думал ты начнешь защищать декларацию типов и я бы тебя поддержал. А ты оказался обыкновенным бесплодным флеймером

alienclaster ★★ ()

А меня ужаснуло количество новых фичей. Это кто же все это будет помнить и не забывать. Сколько там страниц в стандарте? Я уверен, что найдутся монстры, асилившие это. Но будут ли они способны осилить еще что-то, где смогут применить такие плюсы?

Самые же крутые учат китайские иероглифы и не жужжат.

atoku ★★★ ()
Ответ на: комментарий от world

> не обязательно использовать его весь при любом виде работ.

Конечно нет! Но обязательно читать код других, которые используют то, что не используешь ты. А писать легче чем читать. Особенно плюснутых.

atoku ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.