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 ()
Последнее исправление: adriano32 (всего исправлений: 2)
Ответ на: комментарий от LamerOk

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

Это список «платформ, где NULL _не_ представляется в памяти битовой строкой 'все нули'»? На этом закончим.

Ну это же логически вытекает из всего разговора:

С середины разговора ты начинаешь приписывать мне то, чего я не говорил.

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

> С середины разговора ты начинаешь приписывать мне то, чего я не говорил.

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

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

Блин, так это верно практически для всех платформ. С нуля начинается адресация и на PS2/3, и даже на x86. Просто у пользовательских процессов при обращении к первым нескольким кило программно выбрасывается ошибка доступа.

Значение null pointer'а зависит от abi платформы (железо+конпелятор+ос). Для Линукса и gcc null pointer равен нулю. Линукс вообще на всех платформах одинаковую модель памяти поддерживает, но эта модель - всего лишь частный случай. Даже у x86 в 16-битном режиме с сегментами null pointer - это не все нули.

У s390 регистры 32-битные, но для адресации используется 31 бит. Старший бит может быть как нулём, так и единицей, поэтому 0x80000000 - это указатель на адрес 0. Кстати, сравнение указателей тоже интересное получается. И ситуация ещё осложняется тем, что некоторые команды старший бит указателя устанавливают 1.

IBM s-Series - очень прелестная архитектура: в новейшем z/Architecture тянется полная бинарная совместимость с древним s360, чтобы сконпелированные 50 лет назад кобольные программы с утерянными исходниками можно было и сейчас использовать.

У линукса на x86 под это дело отведено, емнип, первые 4 Mib виртуального адресного пространства.

4кб по-умолчанию.

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

> Вот ещё: «type erasure — a process where the compiler removes all information related to type parameters and type arguments within a class or method.» Т.е(по версии oracle) - type erasure именно удаление информации о типах-параметрах, чего в С++ не происходит.

Ну хорошо. Тогда предоставьте способ, который бы позволил после компиляции кода восстановить по результату компиляции типы шаблона. Если эта информация не затирается - способ, определенно, есть. Какой?

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

> я уже говорил — в с++ проблема не в том, как оставить типы, а как их стереть

Ну и где вы видите в вашем примере незатертые типы?

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

> Где это Вы нашли _такое_ определение полиморфной функции? :)

Это общепринятое определение полиморфной функции. Вот где вы видели _другое_ определение - было бы небезынтересно узнать.

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

> точный ответ на твой вопрос: все зависит от того, как *ты* реализуешь дженерики в плюсах (в самом языке их нет)

Во-первых, я ничего не спрашивал. По-этому непонятно, на какой вопрос этот ответ. Во-вторых, речь шла не о генериках, а о параметрическом полиморфизме (который и так реализован в плюсах как строгое подмножество темплейтов). В-третьих, и так всем ясно, что на любом тьюринг-полном ЯП _можно реализовать_ компилятор любого тьюринг-полного ЯП. но как это имеет отношение к предмету обсуждения?

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

>> я уже говорил — в с++ проблема не в том, как оставить типы, а как их стереть

Ну и где вы видите в вашем примере незатертые типы?

похоже, ты с++ не просто не знаешь, а совсем вообще незнаешь

смотри в выхлопе: demangled_name=MyClass<19>

т.е. 19 не стерто

понятно, что никто в здравом уме его вот так доставать не будет, но typeid-ы можно сравнивать

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

> В-третьих, и так всем ясно, что на любом тьюринг-полном ЯП _можно реализовать_ компилятор любого тьюринг-полного ЯП. но как это имеет отношение к предмету обсуждения?

я уже писал, что речь идет не о создании компилятора, а о реализации дженериков с помощь шаблоно  — смотри кусочек кода (там правда нужно static-и поставить)

хотя скорее всего тебе это ничего не скажет

З.Ы. перестань рассуждать о с++ с помощью общих аргументов, почерпнутых из явы и шарпа — это не работает

З.Ы.Ы. а вот как в хаскеле дела обстоят — не знаю

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

вот здесь http://c-faq.com/null/machexamp.html почему-то молчат про s390

то, что у NULL-а может быть *второе*, ненулевое представление, по-моему отнюдь не мешает использовать нулевое (а закидоны с установкой старшего бита машинными командами должен исправлять компилятор, эмитируя доп. команду приведения указателя в нормальный вид для сравнения и всего остального)

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

> я уже писал, что речь идет не о создании компилятора, а о реализации дженериков с помощь шаблоно

А я уже сказал, что речь о генериках нигде не шла - речь шла о параметрическом полиморфизме. При чем о той реализации, что уже _есть_ согласно стандарту, а не о любой другой реализации, которую ты можешь навелосипедить в силу тьюринг-полноты шаблонов. Ну и так все просто как ты говоришь не выйдет - добавляй не добавляй static, а шаблоны _не_ компилируются. а это гарантированный type erasure. Ну добавишь ты в каждый инстанс поля, в которых будут типы аргументов и что? Полиморфных типов после компиляции не осталось? Не осталось. Значит типы затерты. Об информации о _каких_ аргументах вообще может дти речь если нету полиморфных типов? Нет типов- нет и их аргументов. А нельзя получить информацию о том, чего нет.

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

> З.Ы.Ы. а вот как в хаскеле дела обстоят — не знаю

Ну в хаскеле тоже type erasure. Для альтернативной реализации обязателен динамический рантайм, либо jit под капотом.

anonymous
()
Ответ на: комментарий от anonymous
template<typename T>
void out_typeid() {
	cout<<typeid(T).name()<<endl;
}

int main()
{
	out_typeid<void(int,int)>();
	out_typeid<int>();
}

T - это тип, информация о нём доступна во время исполнения программы.

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

>Полиморфных типов после компиляции не осталось
Я же скинул определение type erasure. Читай до просветления.

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

>Полиморфных типов после компиляции не осталось? Не осталось. Значит типы затерты.
Их и до компиляции не было. Значит не затерты.

Об информации о _каких_ аргументах вообще может дти речь если нету полиморфных типов?

Об аргументах шаблона. Шаблон хоть и не тип данных, но аргументы у него есть.

Нет типов- нет и их аргументов. А нельзя получить информацию о том, чего нет.

Типов нет, а аргументы, как сказано выше - есть. И информацию о них, соответственно получить можно.

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

> Ну при чем тут 19? Это класс, а как мне для ф-и тип узнать?

фейспальм.гиф

анонимус (а), от тебя есть кое-какая польза — пока я слушал твой поток сознания, я придумал идею по реализации стирания типов на плюсовых шаблонах

но вообще разговор с тобой происходит примерно так:

а: можно ли в плюсах не стирать типы?

я: вот (дает тарелку с нестертыми типами)

а: а мне надо это в ротик!

я: там есть ложка

а: эта ложка какой-то кусок железа, а мне надо в ротииииик!

если кому-то будет не лень покормить тебя с ложки — тут все есть, а мне это лень

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

> T - это тип, информация о нём доступна во время исполнения программы.

Для джавы можно написать аналогичный код (то есть даже не аналогичный - а просто тупо тот же самый код в джаве будет работать так же точно как в плюсах). Так что у нас имеется два варианта - либо этот код доказывает отсутствие type erasure, и в в джаве type erasure нету, либо он не доказывает отсутствие type erasure и делать на его основе вывод об обсутствии type erasure в плюсах - нельзя.

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

> Их и до компиляции не было. Значит не затерты.

До компиляции (в исходниках) они вполне себе были. Каждый шаблон ф-и - это полиморфный тип и есть.

Шаблон хоть и не тип данных

Шаблон - это как раз тип данных. Полиморфный.

Типов нет, а аргументы, как сказано выше - есть.

Отлично! Функции - нет, а аргументы у этой функции - есть! Вы сами бредовость подобного утверждения не ощущаете?

И информацию о них, соответственно получить можно.

Как можно получить информацию о некотором свойстве объекта А, если объекта А не существует?

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

> но вообще разговор с тобой происходит примерно так:

Нет, разговор примерно так:

я: в плюсах стираются типы

вы: нет в плюсах не стираются типы

я: приведите пример, где они не стираются

вы: ну, конечно, типы стираются, и вообще полиморфных типов в плюсах после компиляции нет, но МЫ МОЖЕМ реализовать некоторую функцию, благодаря которой у нас, быть может, и получится определить тип (пример реализации подобной ф-и)...

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

вы: ну да, типы, конечно, стираются, но МЫ МОЖЕМ реализовать ...

Да кого волнует, что МЫ МОЖЕМ реализовать? Факт остается фактом - после компиляции типов просто _нет_. Ну нету их. Просто потому, что шаблоны - это тупо синтаксическая надстройка и код с шаблонами эквивалентен некотормоу коду без шаблонов. В котором этих типов НЕТ. Это и есть затирание типов.

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

>До компиляции (в исходниках) они вполне себе были. Каждый шаблон ф-и - это полиморфный тип и есть.

Шаблон - это как раз тип данных. Полиморфный.

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

Отлично! Функции - нет, а аргументы у этой функции - есть! Вы сами бредовость подобного утверждения не ощущаете?

Не надо тут додумывать со своей скудной логикой. Аргументы и параметры не только у функций бывают. Даже если шаблон и был бы типом данных - аргументы всё равно не стирались бы(переставали бы быть аргументами, но не стирались).

Как можно получить информацию о некотором свойстве объекта А, если объекта А не существует?

Никак.

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

Темплейты в С++ работают для статических объектов со статическими функциями. Забыть они ничего не могут, ибо без типа не виртуальную функцию не вызвать, место на стеке не определить. Таким образом type erasure неприемлем для C++.
Генерики в java работают для указателей на объекты с виртуальными функциями. Соответственно и место на стеке выделять не надо, и функции вызывать можно. Для java type erasure вполне приемлем.
Не пытайся выкручиваться, type erasure именно об этом - в среде исполнения просто неизвестен тип с которым работает генерик жабы, однако известен тип с которым работает тип, сгенерированный шаблоном С++.

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

>шаблонный «тип данных».
Вот тут я немного сглупил, ибо шаблонным типом можно назвать тип, сгенирированный шаблоном. Ок. Попробуй написать функцию(не шаблон), принимающую в качестве параметра шаблон.

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

Какой-то странный анонимус. Шаблоны в C++ для кодогенерации, которая происходит на стадии компиляции. В сгенерированом из шаблона коде все типы-параметры шаблона присутствуют. Загрузить в runtime классы и инстанцировать с ними шаблон нельзя, т.к. в runtime уже нет шаблона.

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

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

В моем посте ни слова не было о статическом/динамическом определении типа.

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

> Ну давай - напиши функцию(не шаблон), которая принимает в качестве параметра шаблонный «тип данных».

Шаблон - полиморфный тип даных (то есть тип с кайндом * -> *). Если ф-я принимает аргумент полиморфного типа, то она обязательно либо rank2-полиморфна (если квантор внутри), либо rank1-полиморфна (если квантор снаружи). rank2-полиморфизма в плюсах нет, значит это будет обычная полиморфная ф-я. А обычная полиморфная ф-я в плюсах - это шаблон функции.

Даже если шаблон и был бы типом данных

Да не если бы, он и есть.

аргументы всё равно не стирались бы(переставали бы быть аргументами, но не стирались).

ЧЕМ бы тогда они были (ну, если аргументами быть перестали)?

Никак.

Как же вы тогда получаете аргументы полиморфного типа А без самого полиморфного типа А?

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

> Темплейты в С++ работают для статических объектов со статическими функциями. Забыть они ничего не могут, ибо без типа не виртуальную функцию не вызвать, место на стеке не определить.

Таким образом type erasure неприемлем для C++.

Из первого утверждения никак не следует второе. То есть между ними вообще никакой связи нет.

однако известен тип с которым работает тип, сгенерированный шаблоном С++.

Ну я тогда повторю свой вопрос - как восстановить тип полиморфной ф-и по ее инстансу, раз он известен?

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

> принимающую в качестве параметра шаблон

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

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

> Загрузить в runtime классы и инстанцировать с ними шаблон нельзя, т.к. в runtime уже нет шаблона.

О чем и речь. Если шаблон не существует как некоторая сущность в рантайме - это type erasure.

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

Косвенно. Ибо подобное поведение в java реализовать возможно только в динамике. Точное воспроизведение данного поведения в java невозможно благодаря type erasure.

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

>Шаблон - полиморфный тип даных
Шаблоны в С++ - лишь механизм кодогенерации. Сам по себе это не тип данных. Читай Страуструпа.

Соплежуйство по поводу параметров

Тип-параметр, принимаемый шаблоном, используется в дальнейшем. Не стирается.

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

> Если шаблон не существует как некоторая сущность в рантайме - это type erasure.

Как уже написали, шаблон это не type, а механизм кодогенерации на этапе компиляции. Поэтому нельзя это назвать type erasure. Точно также макросы сишные не сущеуствуют в runtime.

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

>Если шаблон не существует как некоторая сущность в рантайме - это type erasure.
Ни о каких сущностях в рантайме речь не идет. Я скинул чёткое определение type erasure - давай не выдумывать, а плясать от этого определения: «type erasure — a process where the compiler removes all information related to type parameters and type arguments within a class or method». Речь идет об удалении типов-параметров генерика.

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

> Косвенно. Ибо подобное поведение в java реализовать возможно только в динамике. Точное воспроизведение данного поведения в java невозможно благодаря type erasure.

Не косвенно, а вполне себе прямо. И type erasure к рассматриваемому примеру вообще никакого отношения не имеет, этот пример работает везде, где есть параметрический полиморфизм. Вне зависимости от реализации.

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

> Шаблоны в С++ - лишь механизм кодогенерации.

Кодогенерация - это детали реализации. Они нам не важны. Де-факто подмножество шаблонов совпадает с параметрическим полиморфизмом (т.к. удовлетворяет определению системы типов с параметрическим полиморфизмом). Это подмножество мы и рассматриваем.

Тип-параметр, принимаемый шаблоном, используется в дальнейшем. Не стирается.

Ну так приведите пример. Я уже какой раз прошу. Вам достаточно один единственны пример привести, чтобы показать - вот, действительно, типы не стираются. И разговор на этом будет закончен, т.к. вы строго докажете свою правоту. но вы этого, почему-то не делаете.

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

> Как уже написали, шаблон это не type, а механизм кодогенерации на этапе компиляции. Поэтому нельзя это назвать type erasure. Точно также макросы сишные не сущеуствуют в runtime.

Почему он не существует в рантайме, и как оно там все в кишках компилятора - это другой вопрос. Он нас не волнует. У нас есть некий ЯП, и в рамках этого ЯП реализован параметрический полиморфизм. Как реализован - не важно, мы абстрагируемся от этих деталей. Нам важен результат - затираются при этой реализации типы или нет. По факту - затираются (то есть поведение полиморфных ф-й такого, что затирается). Детали реализации, повторяю - не важны.

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

> Ни о каких сущностях в рантайме речь не идет. Я скинул чёткое определение type erasure - давай не выдумывать, а плясать от этого определения:

Так я и пляшу от этого определения. Для того, чтобы оно не выполнялось (то есть, чтобы аргументы не были стерты), шаблон должен существовать как некоторая сущность в рантайме.

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

>Для того, чтобы оно не выполнялось (то есть, чтобы аргументы не были стерты), шаблон должен существовать как некоторая сущность в рантайме.
Это не так. Типы, переданные в качестве аргументов шаблона могут использоваться(и используются) вне зависимости от наличия или отсутствия «сущности» в рантайме. Представьте программу, которая принимает аргументы и записывает их в файл. После завершения работы программы аргументы не забываются.

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

>Не косвенно, а вполне себе прямо. И type erasure к рассматриваемому примеру вообще никакого отношения не имеет, этот пример работает везде, где есть параметрический полиморфизм. Вне зависимости от реализации.
Этот пример имеет прямое отношение к type erasure. Это основной минус техники type erasure - генерик не знает с каким типом он работает. В java аналогичный код, со статическим выведением типа - невозможен. Есть сомнения? Приведите же аналогичный код для java.

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

Ну так приведите пример. Я уже какой раз прошу. Вам достаточно один единственны пример привести, чтобы показать - вот, действительно, типы не стираются. И разговор на этом будет закончен, т.к. вы строго докажете свою правоту. но вы этого, почему-то не делаете.

template<typename T>
void out_typeid() {
	cout<<typeid(T).name()<<endl;
}

int main()
{
	out_typeid<void(int,int)>();
	out_typeid<int>();
}

Скидывал же уже.

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

>Детали реализации, повторяю - не важны.
Согласен. «Сущность в рантайме» - деталь реализации, отсутствие её никаких минусов не дает(По крайней мере для C++, ибо после компиляции инстанцировать шаблон больше не понадобится). Тот type erasure, который приписывают java и о котором говорю я - влияет на написание программ. Как проявляется type erasure, описанный вами? То есть - нету сущности в рантайме и всё? Nobody cares.

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

В джаве такой же код будет работать точно так же. Если это пример отсутствия затирания типов, и он в джаве работает (да и вообще работает ВЕЗДЕ, где есть параметрический полиморфизм, вне зависимости от реализации), то, выходит, в джаве затирания типов нет. Но мы знаем, что оно там есть. Жду другой пример (такой, который в джаве работать не будет, ясное дело).

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

> Согласен. «Сущность в рантайме» - деталь реализации, отсутствие её никаких минусов не дает

Ну так type erasure - это тоже деталь реализации. Есть реализация. в которой используется type erasure, есть - в которой полиморфные типы существуют в рантайме.

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

> Это не так. Типы, переданные в качестве аргументов шаблона могут использоваться(и используются)

пример, пример...

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

>А как же драма с ключевым словом export?

Nobody cares

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

C++:

template<typename T>
T test(T smthng) {
	return T();
}
Java:
public static <T> T test(T smthng) {
	return new T();
}
работает?

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

Детали не должны влиять на результат.

Есть реализация. в которой используется type erasure, есть - в которой полиморфные типы существуют в рантайме.

а есть шаблоны.

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