Standard Library
В таблице приведены возможности библиотеки С++14/17, за которые мы голосовали в мае.
Status |
Std |
Paper |
Title |
missing |
C++14 | N3462 | SFINAE-Friendly result_of |
missing |
C++17 |
N4387 |
Improving pair And tuple |
missing |
C++17 |
N4508 |
shared_mutex (Untimed) |
VS2015 |
C++14 |
N3302 |
constexpr For <complex> |
VS2015 |
C++14 |
N3469 |
constexpr For <chrono> |
VS2015 |
C++14 |
N3470 |
constexpr For <array> |
VS2015 |
C++14 |
N3471 |
constexpr For <initializer_list>, <tuple>, <utility> |
VS2015 |
C++14 |
N3545 |
integral_constant::operator()() |
VS2015 |
C++14 |
N3642 |
UDLs For <chrono>, <string> (1729ms, "meow"s, etc.) |
VS2015 |
C++14 |
N3644 |
Null Forward Iterators |
VS2015 |
C++14 |
N3654 |
quoted() |
VS2015 |
C++14 |
N3657 |
Heterogeneous Associative Lookup |
VS2015 |
C++14 |
N3658 |
integer_sequence |
VS2015 |
C++14 |
N3659 |
shared_mutex (Timed) |
VS2015 |
C++14 |
N3668 |
exchange() |
VS2015 |
C++14 |
N3669 |
Fixing constexpr Member Functions Without const |
VS2015 |
C++14 |
N3670 |
get<T>() |
VS2015 |
C++14 |
N3671 |
Dual-Range equal(), is_permutation(), mismatch() |
VS2015 |
C++14 |
N3778 |
Sized Deallocation |
VS2015 |
C++14 |
N3779 |
UDLs For <complex> (3.14i, etc.) |
VS2015 |
C++14 |
N3789 |
constexpr For <functional> |
VS2015 |
C++14 |
N3887 |
tuple_element_t |
VS2015 |
C++14 |
N3891 |
Renaming shared_mutex (Timed) To shared_timed_mutex |
VS2015 |
C++17 |
N3911 |
void_t |
VS2015 |
C++17 |
N4089 |
Safe Conversions In unique_ptr<T[]> |
VS2015 |
C++17 |
N4169 |
invoke() |
2015 opt-in |
C++17 |
N4190 |
Removing auto_ptr, random_shuffle(), And Old <functional> Stuff |
VS2015 |
C++17 |
N4258 |
noexcept Cleanups |
VS2015 |
C++17 |
N4259 |
uncaught_exceptions() |
VS2015 |
C++17 |
N4277 |
Trivially Copyable reference_wrapper |
VS2015 |
C++17 |
N4279 |
insert_or_assign()/try_emplace() For map/unordered_map |
VS2015 |
C++17 |
N4280 |
size(), empty(), data() |
VS2015 |
C++17 |
N4366 |
Precisely Constraining unique_ptr Assignment |
VS2015 |
C++17 |
N4389 |
bool_constant |
VS2013 |
C++14 |
N3346 |
Minimal Container Element Requirements |
VS2013 |
C++14 |
N3421 |
Transparent Operator Functors (less<>, etc.) |
VS2013 |
C++14 |
N3655 |
Alias Templates For <type_traits> (decay_t, etc.) |
VS2013 |
C++14 |
N3656 |
make_unique() |
VS2013 |
C++17 |
N4510 |
Supporting Incomplete Types In vector/list/forward_list |
N/A |
C++14 |
N3924 |
Discouraging rand() |
N/A |
C++17 |
N4284 |
Contiguous Iterators |
2015 opt-in означает что существует защитное макро. По умолчанию работает auto ptr/etc. Если вы определите _HAS_AUTO_PTR_ETC в 0 на уровне проекта (через командный параметр или проектный файл), то auto ptr/etc не предоставляется. В дальнейшем предусматривается opt-out, а через релиз auto ptr/etc будет убран совсем.
«N/A» означает что эти возможности вносят изменения в формулировки стандарта, но никак не затрагивают имплементоров или пользователей.
Имплементация стандартной библиотеки C99 готова, кроме tgmath.h (что иррелевантно к C++) и макросов-прагм CX_LIMITED_RANGE/FP_CONTRACT.
Имплементация стандартной C++11 библиотеки готова.
Имплементация стандартной C++14 библиотеки готова, за исключением Expression SFINAE в результате (N3462) и std::function (LWG 2132), плюс 11 открытых Library Issues.
Имплементация стандартной C++17 библиотеки готова, за исключением улучшений в pair/tuple (N4387) и untimed shared_mutex (N4508), плюс 10 открытых Library Issues.
Все оставшиеся исключения являются багами. (На текущий момент мы исправили около 160 багов в STL между 2013 и 2015 релизами. Год назад, был предоставлен список первых наборов исправлений.
(C99) offsetof
(C++11) numeric_limits<float/double/long>
double>::quiet_NaN()/signaling_NaN()
(C++11) mutex's default constructor
(C++14) error_category's default constructor
(C++14) min()/max()/minmax() for initializer_list
(C++17) min_element()/max_element()/minmax_element()
На данный момент команда сфокусирована на получении полного соответствия стандарту, что является более высоким по приоритету нежели имплементация технических спецификаций, утверждаемых комитетом. (мы думаем что ТС’ы важны, но стандарт еще важнее) Тем не менее мы уже имплементировали несколько ТС возможностей: Filesystem «V3» TS (N4100) и Uniform Container Erasure (N4529 [container.erasure]).
Core Language
[RTM] Эти возможности имплементированы между RC и RTM.
[1] Мы планируем приступить к имплементации Expression SFINAE в компиляторе сразу после 2015 RTM, и планируем выпустить в свет в обновлении. Но возможно это не получится в 2015 Update 1.
[2] Поддержка препроцессора C99 осталась без изменений. Частичный статус остался в силе так как несмотря на то что компилятор поддерживает variadic макросы, поведение препроцессора не соответствует стандарту C99/C++11 во многих вещах.
[3] «Extended integer types» находятся в списке Not Applicable по причине того, что стандарт не требует поддержки типов длиннее long long. Мы препочли не поддерживать такие типы, что является разрешенным поведением. GCC и Clang тоже не имплементировали эти типы.
[4] «Avoiding/fusing allocations» находится в списке Not Applicable по причине того, что стандарт позволяет, но не требует такой оптимизации. Пока принято решение не имплементировать эту возможность, что является разрешенным поведением.
Замечание в части C++11 constexpr: это очень большая «фича» с сложным взаимодействием, имплементирована на базе нового кода компилятора и потребовала очень серьезной модернизации многих компонент. Мы подозреваем что в текущем варианте есть баги и ограничения, и мы будем выпускать исправления в будущих обновлениях.
Хотим сказать большое спасибо всем, кто отправлял репорты об ошибках для промежуточных версий компилятора. Если вы найдете новые ошибки пожалуйста отправляйте их нам через Microsoft Connect и Send A Smile/Frown.
Комментарии (19)
AlexPublic
17.07.2015 01:37Ну что же, компилятор действительно допилили до современно уровня. Во всяком случае по соответствию стандарту ( производительность кода надо ещё смотреть). Даже удивительно.
Однако не думаю, что даже такой факт будет способен изменить отношение разработчиков, отвернувшихся от MS после десятилетия наплевательского отношения к нативной разработке.
Да, и кстати… Вы бы лучше как-то поправили такие msdn.microsoft.com/ru-ru/library/dn872463%28v=vs.140%29.aspx заголовки, а то после прочтения уж слишком смешно становится. Назвать «созданием кроссплатформенных приложений» возможность написания отдельных приложений под каждую указанную платформу — это перебор даже для MS. )))mapron
17.07.2015 08:56Я из статьи по ссылке не понял — общий код-то для этих приложений можно использовать?
AlexPublic
17.07.2015 14:50-2Создавать библиотеки и подключать их в разных приложениях C++ умеет от рождения. Так что непонятно:
1. Что тут нового
2. Причём тут «кроссплатформенные приложения».Chaos_Optima
17.07.2015 15:17Нового наверное то, что студия теперь может в эмулятор андройда и эмулятор ios (то что мак требуется думаю можно пренебречь) и соответственно дебаг как на эмуляторе так и на девайсах.
А кросплатформенность заключается в том, что один код на все платформы, и под все платформы можно собирать код из под одной ide. Возможно вы ожидали что-то вроде marmalade но данное решение имхо гибче.AlexPublic
17.07.2015 15:441. Вообще то у них там целевая ОС задаётся при создание проекта, а не как один из вариантов конфигурации сборки. Так что получается как раз разные проекты под разные ОС. Ну во всяком случае судя по скринам — сам я не пробовал. Но даже если они в итоге и сумеют осилить нормальное решение (один проект с разными конфигурациями сборки под разные ОС), то это будет лишь микроскопический шажок (причём уже давно реализованный в таких инструментах как cmake/qmake/scons/waf и т.п.) к кроссплатформенности. Потому как главная сложность в написание кроссплатформенных приложений на C++ вовсе не в сборке.
2. И не будет там один код под все платформы. Если конечно не подключить библиотеку типа Qt или wxWidgets (у этих правда нет пока Андроида) или аналог от MS. Но такой же библиотеки (с сопутствующими инструментами) нет в поставке VS, не так ли? )
А ожидал я от заголовка «создание кроссплатформенных приложений» совсем не marmalade (это всё же игровое решение), а скорее что-то вроде Qt. Хотя принципы у них конечно похожие.Chaos_Optima
17.07.2015 15:501) Да проект создаётся под каждую ось, но вот библиотека шарящаяся на разные проекты, одна.
2) В шарящаяся библиотеке и находится единый код, под разные платформы.AlexPublic
17.07.2015 16:42Ну, т.е. приложение не кроссплатформенное. В отличие от того, которое можно получить и собрать в пару кликов в том же Qt Creator.
Chaos_Optima
17.07.2015 16:55+1Это какое-то цепляние к словам, я например рассматриваю это с точки стороны геймдева, Я создаю два проекта под андройд и иос, и ещё один для шарящейся либы. Я не меняю стандартные обвязки в иос и андройд проектах, я их даже не открываю, я пишу только библиотеку которая шарится, только один код, чем это не мультиплатформенная разработка? В том же QT надо указывать под какую платформу собираешь.
AlexPublic
17.07.2015 17:42Если в этих двух проектах не будет находиться ни строчки кода (только файлы проектов или что-то подобное), то это безусловно будет кроссплатформенное приложение (хотя и с сомнительной системой сборки). Только как такого добиться без использования жирных кроссплатформенных фреймворков? )
Ну и кстати говоря собирать приложение под Андроид (или любую другую ОС) в любой IDE (включая VisualStudio) я умел задолго до данного релиза VS. Однако это лишь маленькая часть того, что необходимо для написания кроссплатформенного приложения.Chaos_Optima
17.07.2015 18:06В этих проектах будет стандартный сгенерированный код, который при желании можно изменить или дополнить, когда например нужно реализовать специфичную для платформы фичу, которая не промаплена в библиотеку.
Собирать это ок (хотя я не припомню инструментов для сборки под iOS), а что насчёт дебага? Разве можно было из студии дебажить приложение на девайсе?AlexPublic
17.07.2015 19:15Кем сгенерированный? ) Я не увидел в VisualStudio инструментов для этого. И опять же что за библиотека? Входит в поставку VS? )
По поводу отладки для VS давно уже был плагин (кстати, помнится это даже отечественный продукт) для полноценной работы с gdb. Ну а дальше понятно, что дело техники. Правда лично я таким не пользуюсь. В том смысле, что самой VS уже лет 7 наверное не пользуюсь.Chaos_Optima
17.07.2015 20:57Генерирует VisualStudio, да входит в поставку.
подробнее тут, на 34 минуте начинается про С++.
С плагинами студия всё может)) а вот из коробки она раньше не могла, или вы думаете раз это функция доступна с помощью плагина, то её ненужно разрабатывать? И я надеюсь вы мне назовёте плагин для дебага на ios.AlexPublic
17.07.2015 21:35На видео показана просто генерация «hello world» на базе Native Activity — вполне классическая вещь при создание проекта. Но какое это имеет отношение к реальной работе и реальным проектам? И я так и не понял, как называется то эта самая кроссплатформенная библиотека от MS? Надеюсь речь не про OpenGL? )))
0xd34df00d
17.07.2015 13:25Relaxed constexpr и NSDMI, не ломающих «агрегатовость» объекта (и возможность его инициализации через init list без написания явного конструктора) всё ещё нет :(
mezastel
17.07.2015 10:25+3К слову, разработчики Visual C++ прямым текстом обещали что обновления компилятора будут out of band. И где?
xvilka
17.07.2015 13:54Поддержка препроцессора C99 осталась без изменений. Частичный статус остался в силе так как несмотря на то что компилятор поддерживает variadic макросы, поведение препроцессора не соответствует стандарту C99/C++11 во многих вещах.
Но почему?
Приходится для компиляции с нативным ABI использовать clang-cl. Когда в нём допилят нативные исключения, его можно будет использовать и для C++ кода, благо поддержка стандартов там лучше.
Door
Спасибо за перевод. Ребята работают! Вот здесь, например, ещё один потрясающий список фиксов и улучщений в VS 2015.