[Перевод] Возможности С++ 11/14/17 в Visual Studio 2015 RTM

195aa8cf281bd3b6166d848e22134329.png Близится дата релиза 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 

VS2015
C++14
N3469
constexpr For 

VS2015
C++14
N3470
constexpr For 

VS2015
C++14
N3471
constexpr For , , 

VS2015
C++14
N3545
integral_constant::operator()()

VS2015
C++14
N3642
UDLs For ,  (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()

VS2015
C++14
N3671
Dual-Range equal(), is_permutation(), mismatch()

VS2015
C++14
N3778
Sized Deallocation

VS2015
C++14
N3779
UDLs For  (3.14i, etc.)

VS2015
C++14
N3789
constexpr For 

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

VS2015
C++17
N4169
invoke()

2015 opt-in
C++17
N4190
Removing auto_ptr, random_shuffle(), And Old  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  (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
    
    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.

© Habrahabr.ru