Близится дата релиза Visual Studio 2015, и многие хотели бы узнать, как обстоят дела с поддержкой стандартов C++ в компиляторе Microsoft.


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



C++11 Core Language Features
VS 2013
VS 2015
Notes
Rvalue references
Partial Yes
ref-qualifiers
No Yes
Non-static data member initializers
Partial Yes
Variadic templates
Yes Yes
Initializer lists
Partial Yes
static_assert
Yes Yes
auto
Yes Yes
Trailing return types
Yes Yes
Lambdas
Yes Yes
decltype
Yes Yes
Right angle brackets
Yes Yes
Default template args for function templates
Yes Yes
Expression SFINAE
No No [1]
Alias templates
Yes Yes
Extern templates
Yes Yes
nullptr
Yes Yes
Strongly typed enums
Yes Yes
Forward declared enums
Yes Yes
Attributes
No Yes [RTM]
constexpr
No Yes [RTM]
Alignment
Partial Yes
Delegating constructors
Yes Yes
Inheriting constructors
No Yes
Explicit conversion operators
Yes Yes
char16_t and char32_t
No Yes
Unicode string literals
No Yes
Raw string literals
Yes Yes
Universal character names in literals
No Yes
User-defined literals
No Yes
Standard-layout and trivial types
Yes Yes
Defaulted and deleted functions
Partial Yes
Extended friend declarations
Yes Yes
Extended sizeof
No Yes
Inline namespaces
No Yes
Unrestricted unions
No Yes
Local and unnamed types as template args
Yes Yes
Range-based for-loop
Yes Yes
override and final
Yes Yes
Minimal GC support
Yes Yes
noexcept
No Yes
C++11 Core Language Features: Concurrency
VS 2013
VS 2015
Notes
Reworded sequence points
Yes Yes
Atomics
Yes Yes
Strong compare and exchange
Yes Yes
Bidirectional fences
Yes Yes
Memory model
Yes Yes
Data-dependency ordering
Yes Yes
Data-dependency ordering: attributes
No Yes [RTM]
exception_ptr
Yes Yes
quick_exit and at_quick_exit
No Yes
Atomics in signal handlers
Yes Yes
Thread-local storage
Partial Yes
Magic statics
No Yes
C++11 Core Language Features: C99
VS 2013
VS 2015
Notes
__func__
Partial Yes
C99 preprocessor
Partial Partial [2]
long long
Yes Yes
Extended integer types
N/A N/A [3]
C++14 Core Language Features
VS 2013
VS 2015
Notes
Tweaked wording for contextual conversions
Yes Yes
Binary literals
No Yes
auto and decltype(auto) return types
No Yes
init-captures
No Yes
Generic lambdas
No Yes
Variable templates
No No
Extended constexpr
No No
NSDMIs for aggregates
No No
Avoiding/fusing allocations
N/A N/A [4]
[[deprecated]] attributes
No Yes [RTM]
Sized deallocation
No Yes
Digit separators
No Yes
C++1z (C++17?) Core Language Features
VS 2013
VS 2015
Notes
New rules for auto with braced-init-lists
No Yes
Terse static_assert
No No
typename in template template-parameters
No Yes
Removing trigraphs
Yes Yes
Nested namespace definitions
No No
Fixing qualification conversions
No No
Attributes for namespaces and enumerators
No Yes [RTM]
u8 character literals
No Yes [RTM]
Allowing more non-type template args
No No
Fold expressions
No No


[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)


  1. Door
    16.07.2015 21:48
    +1

    Спасибо за перевод. Ребята работают! Вот здесь, например, ещё один потрясающий список фиксов и улучщений в VS 2015.


  1. AlexPublic
    17.07.2015 01:37

    Ну что же, компилятор действительно допилили до современно уровня. Во всяком случае по соответствию стандарту ( производительность кода надо ещё смотреть). Даже удивительно.

    Однако не думаю, что даже такой факт будет способен изменить отношение разработчиков, отвернувшихся от MS после десятилетия наплевательского отношения к нативной разработке.

    Да, и кстати… Вы бы лучше как-то поправили такие msdn.microsoft.com/ru-ru/library/dn872463%28v=vs.140%29.aspx заголовки, а то после прочтения уж слишком смешно становится. Назвать «созданием кроссплатформенных приложений» возможность написания отдельных приложений под каждую указанную платформу — это перебор даже для MS. )))


    1. mapron
      17.07.2015 08:56

      Я из статьи по ссылке не понял — общий код-то для этих приложений можно использовать?


      1. dmandreev Автор
        17.07.2015 10:07
        +2

        image


        1. mapron
          17.07.2015 14:28

          Ну по-моему, все нормально, не вижу «перебора». Это к комменту выше.


      1. AlexPublic
        17.07.2015 14:50
        -2

        Создавать библиотеки и подключать их в разных приложениях C++ умеет от рождения. Так что непонятно:
        1. Что тут нового
        2. Причём тут «кроссплатформенные приложения».


        1. Chaos_Optima
          17.07.2015 15:17

          Нового наверное то, что студия теперь может в эмулятор андройда и эмулятор ios (то что мак требуется думаю можно пренебречь) и соответственно дебаг как на эмуляторе так и на девайсах.
          А кросплатформенность заключается в том, что один код на все платформы, и под все платформы можно собирать код из под одной ide. Возможно вы ожидали что-то вроде marmalade но данное решение имхо гибче.


          1. AlexPublic
            17.07.2015 15:44

            1. Вообще то у них там целевая ОС задаётся при создание проекта, а не как один из вариантов конфигурации сборки. Так что получается как раз разные проекты под разные ОС. Ну во всяком случае судя по скринам — сам я не пробовал. Но даже если они в итоге и сумеют осилить нормальное решение (один проект с разными конфигурациями сборки под разные ОС), то это будет лишь микроскопический шажок (причём уже давно реализованный в таких инструментах как cmake/qmake/scons/waf и т.п.) к кроссплатформенности. Потому как главная сложность в написание кроссплатформенных приложений на C++ вовсе не в сборке.
            2. И не будет там один код под все платформы. Если конечно не подключить библиотеку типа Qt или wxWidgets (у этих правда нет пока Андроида) или аналог от MS. Но такой же библиотеки (с сопутствующими инструментами) нет в поставке VS, не так ли? )

            А ожидал я от заголовка «создание кроссплатформенных приложений» совсем не marmalade (это всё же игровое решение), а скорее что-то вроде Qt. Хотя принципы у них конечно похожие.


            1. Chaos_Optima
              17.07.2015 15:50

              1) Да проект создаётся под каждую ось, но вот библиотека шарящаяся на разные проекты, одна.
              2) В шарящаяся библиотеке и находится единый код, под разные платформы.


              1. AlexPublic
                17.07.2015 16:42

                Ну, т.е. приложение не кроссплатформенное. В отличие от того, которое можно получить и собрать в пару кликов в том же Qt Creator.


                1. Chaos_Optima
                  17.07.2015 16:55
                  +1

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


                  1. AlexPublic
                    17.07.2015 17:42

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

                    Ну и кстати говоря собирать приложение под Андроид (или любую другую ОС) в любой IDE (включая VisualStudio) я умел задолго до данного релиза VS. Однако это лишь маленькая часть того, что необходимо для написания кроссплатформенного приложения.


                    1. Chaos_Optima
                      17.07.2015 18:06

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

                      Собирать это ок (хотя я не припомню инструментов для сборки под iOS), а что насчёт дебага? Разве можно было из студии дебажить приложение на девайсе?


                      1. AlexPublic
                        17.07.2015 19:15

                        Кем сгенерированный? ) Я не увидел в VisualStudio инструментов для этого. И опять же что за библиотека? Входит в поставку VS? )

                        По поводу отладки для VS давно уже был плагин (кстати, помнится это даже отечественный продукт) для полноценной работы с gdb. Ну а дальше понятно, что дело техники. Правда лично я таким не пользуюсь. В том смысле, что самой VS уже лет 7 наверное не пользуюсь.


                        1. Chaos_Optima
                          17.07.2015 20:57

                          Генерирует VisualStudio, да входит в поставку.
                          подробнее тут, на 34 минуте начинается про С++.
                          С плагинами студия всё может)) а вот из коробки она раньше не могла, или вы думаете раз это функция доступна с помощью плагина, то её ненужно разрабатывать? И я надеюсь вы мне назовёте плагин для дебага на ios.


                          1. AlexPublic
                            17.07.2015 21:35

                            На видео показана просто генерация «hello world» на базе Native Activity — вполне классическая вещь при создание проекта. Но какое это имеет отношение к реальной работе и реальным проектам? И я так и не понял, как называется то эта самая кроссплатформенная библиотека от MS? Надеюсь речь не про OpenGL? )))


    1. 0xd34df00d
      17.07.2015 13:25

      Relaxed constexpr и NSDMI, не ломающих «агрегатовость» объекта (и возможность его инициализации через init list без написания явного конструктора) всё ещё нет :(


  1. mezastel
    17.07.2015 10:25
    +3

    К слову, разработчики Visual C++ прямым текстом обещали что обновления компилятора будут out of band. И где?


  1. xvilka
    17.07.2015 13:54

    Поддержка препроцессора C99 осталась без изменений. Частичный статус остался в силе так как несмотря на то что компилятор поддерживает variadic макросы, поведение препроцессора не соответствует стандарту C99/C++11 во многих вещах.

    Но почему?
    Приходится для компиляции с нативным ABI использовать clang-cl. Когда в нём допилят нативные исключения, его можно будет использовать и для C++ кода, благо поддержка стандартов там лучше.