Возможности С++ 11/14/17 в Visual Studio 2015 RTM

от автора

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

ссылка на оригинал статьи http://habrahabr.ru/post/262805/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *