ميزة C++ 17 أصبحت الآن مكتملة ، ومن غير المرجح أن تواجه تغييرات كبيرة. تم طرح مئات المقترحات لـ C++ 17.
أي من هذه الميزات تمت إضافتها إلى C++ في C++ 17؟
عند استخدام برنامج التحويل البرمجي C++ الذي يدعم "C++ 1z" ، أي من هذه الميزات ستكون متاحة عند تحديث برنامج التحويل البرمجي إلى C++ 17؟
[*this]{ std::cout << could << " be " << useful << '\n'; }
[[fallthrough]]
، [[nodiscard]]
، [[maybe_unused]]
سمات
using
في السمات لتجنب الاضطرار إلى تكرار مساحة اسم سمة.
المترجمون الآن مطلوبون لتجاهل السمات غير القياسية التي لا يتعرفون عليها .
بسيط static_assert(expression);
بدون سلسلة
لا throw
ما لم throw()
، و throw()
هي noexcept(true)
.
std::tie
من الدرجة الأولى مع auto
name__const auto [it, inserted] = map.insert( {"foo", bar} );
it
و inserted
بنوع مستخلص من pair
الذي map::insert
يعرضه.std::array
s والهياكل مسطحة نسبياif (init; condition)
و switch (init; condition)
if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
if(decl)
إلى الحالات التي يكون فيها decl
غير قابل للتحويل إلى منطقي.التعميم القائم على النطاق للحلقات
ترتيب ثابت لتقييم تعبيرات (بعض) مع بعض تعديلات
.then
على العمل في المستقبل.ضمانات التقدم إلى الأمام (FPG) (أيضًا ، FPGs للخوارزميات المتوازية )
u8'U', u8'T', u8'F', u8'8'
الأحرف الحرفية (السلسلة موجودة بالفعل)
المنشئات الموروثة إصلاحات في بعض الحالات الزاوية (انظر P0136R0 للحصول على أمثلة من التغييرات السلوك)
std::string
مثل مرجع صفيف أو سلسلة فرعيةstring const&
مرة أخرى. يمكن أن تجعل تحليل bajillion مرات أسرع."hello world"sv
char_traits
std::byte
قبالة أكثر مما يمكن مضغه.
std::invoke
std::apply
std::make_from_Tuple
، std::apply
المطبقة على بناء الكائنات
is_invocable
، is_invocable_r
، invoke_result
result_of
is_invocable<Foo(Args...), R>
هي "يمكنك الاتصال بـ Foo
باستخدام Args...
والحصول على شيء متوافق مع R
name__" ، حيث R=void
هو الإعداد الافتراضي.invoke_result<Foo, Args...>
هو std::result_of_t<Foo(Args...)>
لكن يبدو أنه أقل إرباكًا؟[class.directory_iterator]
و [class.recursive_directory_iterator]
fstream
name__s يمكن فتحها باستخدام path
name__s ، وكذلك مع السلاسل const path::value_type*
.
for_each_n
reduce
name__
transform_reduce
exclusive_scan
inclusive_scan
transform_exclusive_scan
transform_inclusive_scan
تمت إضافته لأغراض الترابط ، مكشوفًا حتى إذا لم تكن تستخدمها مترابطة
atomic<T>
::is_always_lockfree
std::lock
الألم عند قفل أكثر من واحد في وقت واحد.std
والآليات ذات الصلة[func.searchers]
and [alg.search]
std::function
للمخصصينstd::sample
، أخذ العينات من نطاق؟
try_emplace
و insert_or_assign
الربط لـ map<>
و unordered_map<>
و set<>
و unordered_set<>
non-const .data()
لسلسلة.
غير عضو std::size
، std::empty
، std::data
std::begin
/end
name__emplace
مجموعة الوظائف الآن بإرجاع مرجع إلى الكائن الذي تم إنشاؤه .
unique_ptr<T[]>
fixes and other unique_ptr
بتعديل.weak_from_this
وبعضها ثابت للمشاركة من هذاstd
الأخرى:{}
إنشاء std::Tuple
والتحسينات الأخرىتعتمد مكتبة C++ 17 على C11 بدلاً من C99
std[0-9]+
المحجوزة لـ المكتبات القياسية المستقبلية
std
المكشوفةstd::clamp()
std::clamp( a, b, c ) == std::max( b, std::min( a, c ) )
تقريبًاgcd
NAME__ و lcm
NAME_std::uncaught_exceptions
std::as_const
std::bool_constant
_v
std::void_t<T>
std::owner_less<void>
std::less<void>
، لكن بالنسبة للمؤشرات الذكية للفرز بناءً على المحتوياتstd::chrono
polishstd::conjunction
، std::disjunction
، std::negation
يتعرضstd::not_fn
std
name__std::less
.<codecvt>
memory_order_consume
result_of
، تم استبداله بـ invoke_result
shared_ptr::unique
، إنها ليست آمنة للغايةIsocpp.org has لديه قائمة مستقلة من التغييرات منذ C++ 14؛ لقد نهب جزئيا.
بطبيعة الحال ، يستمر عمل TS بشكل متوازٍ ، لذلك هناك بعض الخدمات TS غير الناضجة التي يجب أن تنتظر التكرار التالي. الهدف من التكرار التالي هو C++ 20 كما هو مخطط له سابقًا ، وليس C++ 19 كما تشير بعض الشائعات. تم تجنب C++ 1O.
القائمة الأولية مأخوذة من مشاركة reddit هذه و مشاركة reddit ، مع روابط مضافة عبر googling أو من صفحة isocpp.org أعلاه.
تم حذف إدخالات إضافية من SD-6 قائمة اختبار الميزات.
قائمة ميزات clang و قائمة ميزات المكتبة بجانب النهب. لا يبدو هذا موثوقًا به ، لأنه C++ 1z ، وليس C++ 17.
هذه الشرائح لديها بعض الميزات المفقودة في مكان آخر.
بينما لم يتم طلب "ما تمت إزالته" ، فإليك قائمة مختصرة تتضمن بعض الأشياء ((معظمها؟) التي تم إهمالها سابقًا) والتي تمت إزالتها في C++ 17 من C++:
register
NAME_ ، الكلمة الرئيسية محفوظة للاستخدام في المستقبلbool b; ++b;
<functional>
stuff القديمة ، random_shuffle
std::function
كانت هناك إعادة صياغة. لست متأكدًا مما إذا كان لهذه التأثيرات أي تأثير على الكود ، أو إذا كانت مجرد عمليات تنظيف في المعيار:
P0505R0 (constexpr chrono)
P0418R2 (القرص الذري)
P0512R0 (قرص وسيطة خصم القرص)
P0490R0 (تعديلات الربط المنظمة)
P0513R0 (التغييرات إلى std::hash
)
P0502R0 (استثناءات متوازية)
P0509R1 (تحديث القيود على معالجة الاستثناءات)
P0012R1 (اجعل مواصفات الاستثناء جزءًا من نظام الكتابة)
P0510R0 (قيود على المتغيرات)
P0504R0 (علامات للاختيار/البديل/أي)
P0497R0 (قرص ptr المشترك)
P0508R0 (مقابض عقدة الربط المركبة)
P0521R0 (عدد مرات استخدام المؤشر المشترك وتغييرات فريدة؟)
https://isocpp.org/files/papers/p0636r0.html