C ++ 17'deki yeni özellikler nelerdir?


1007

C ++ 17 artık özellik tamamlandı, bu nedenle büyük değişiklikler yaşama olasılığı düşük. C ++ 17 için yüzlerce teklif öne sürüldü.

Bu özelliklerden hangisi C ++ 17'de C ++ 'a eklendi?

"C ++ 1z" yi destekleyen bir C ++ derleyicisi kullanırken, derleyici C ++ 17'ye güncellediğinde bu özelliklerden hangisi kullanılabilir olacak?


26
Clang'a göre özelliklerin tam listesi: kütüphane , çekirdek dil .
Kerrek SB

3
Bu blog bost güzel bir özetini vardır: bfilipek.com/2017/01/cpp17features.html
atb

13
C ++ 14'ten C ++ 17'ye yapılan büyük değişikliklerin listesi için C ++ 14 ve C ++ 17 DIS (P0636r0) belgesinin resmi Değişikliklerine bakın .
jotik

1
@RaghavNavada Harika! C ++ 20 bölümü korunuyor mu? Orada # 53 ... fakat Kapalı olduğu
LF

Bu sitedeki her şey en.cppreference.com/w/cpp , gerekli sürümle işaretlenmiştir.
jw_

Yanıtlar:


1266

Dil özellikleri:

Şablonlar ve Genel Kod

Lambda

Öznitellikler

Sözdizimi temizleme

Daha temiz çoklu dönüş ve akış kontrolü

  • Yapısal ciltlemeler

    • Temel olarak, birinci sınıf std::tieileauto
    • Misal:
      • const auto [it, inserted] = map.insert( {"foo", bar} );
      • Değişkenleri oluşturur itve insertedgelen çıkar sanan tip pairolduğu map::insertgetiriler.
    • Tuple / pair-like & std::arrays ve nispeten düz yapılarla çalışır
    • Aslında standart olarak yapılandırılmış ciltlemeler
  • if (init; condition) ve switch (init; condition)

    • if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
    • Mantıksal olarak boole dönüştürülemeyen if(decl)durumları genişletir decl.
  • Döngüler için genelleme aralığı tabanlı

    • Çoğunlukla sentineller veya başlangıç ​​yineleyicileri ile aynı olmayan son yineleyiciler için destek olduğu görülüyor, bu da boş sonlandırılmış döngüler ve benzerlerine yardımcı oluyor.
  • eğer bağlam

    • Neredeyse genel kodu basitleştirmek için çok istenen özellik.

Çeşitli

Kütüphane ilaveleri:

Veri tipleri

  • std::variant<Ts...>

    • Neredeyse her zaman boş olmayan son kontrol ettim?
    • Etiketli birleşim türü
    • {Müthiş | kullanışlı}
  • std::optional

    • Belki bir şeylerden birini tutar
    • Gülünç yararlı
  • std::any

    • Her şeyden birini tutar (kopyalanabilir)
  • std::string_view

    • std::string referanstan karaktere dizi veya alt dize gibi
    • Bir string const&daha asla alma . Ayrıca bir bajillion kat daha hızlı ayrıştırma yapabilirsiniz.
    • "hello world"sv
    • constexpr char_traits
  • std::byte çiğneyebileceğinden daha fazla.

    • Ne bir tamsayı ne de bir karakter, sadece veri

Bir şeyler çağır

Dosya Sistemi TS v1

Yeni algoritmalar

  • for_each_n

  • reduce

  • transform_reduce

  • exclusive_scan

  • inclusive_scan

  • transform_exclusive_scan

  • transform_inclusive_scan

  • İplik geçirme amacıyla eklenmiş, dişli kullanılmasanız bile açıkta

Threading

(bölümleri) Kütüphane Temelleri TS v1 yukarıda veya aşağıda ele alınmamıştır

Konteyner İyileştirmeleri

Akıllı işaretçi değişiklikleri

Diğer stdveri tipi geliştirmeleri:

Çeşitli

özellikleri

Kaldırıldı

Isocpp.org, C ++ 14'ten bu yana bağımsız bir değişiklik listesine sahiptir; kısmen yağmalandı.

Doğal olarak TS çalışması paralel olarak devam eder, bu yüzden olgunlaşmamış bir sonraki TS'yi beklemek zorunda kalacak bazı TS vardır. Bir sonraki yinelemenin hedefi, bazı söylentilerin ima ettiği gibi C ++ 19 değil, daha önce planlandığı gibi C ++ 20'dir. C ++ 1O önlendi.

Bu reddit gönderisinden ve bu reddit gönderisinden alınan , googling veya yukarıdaki isocpp.org sayfasından bağlantılar eklenmiş ilk liste .

SD-6 özellik testi listesinden yağmalanan ek girişler .

clang'ın özellik listesi ve kütüphane özellik listesi yağmalanacak. Bu güvenilir görünmüyor, çünkü C ++ 17 değil, C ++ 1z.

bu slaytlarda başka yerlerde eksik bazı özellikler vardı.

"Kaldırılanlar" sorulmasa da, C ++ 17'den C ++ 'dan kaldırılan birkaç şeyin ((çoğunlukla?) Daha önce kullanımdan kaldırıldı) kısa bir listesi:

kaldırıldı:

Yeniden düzenlemeler vardı. Bunların kod üzerinde herhangi bir etkisi olup olmadığından veya yalnızca standarttaki temizlemelerden emin değilim:

Henüz yukarıdakilere entegre edilmemiş kağıtlar:

  • P0505R0 (constexpr chrono)

  • P0418R2 (atomik ayarlamalar)

  • P0512R0 (şablon bağımsız değişken kesinti tweaks)

  • P0490R0 (yapısal bağlayıcı ince ayarlar )

  • P0513R0 (olarak değişir std::hash)

  • P0502R0 (paralel istisnalar)

  • P0509R1 (kural dışı durum işleme ile ilgili kısıtlamaların güncellenmesi)

  • P0012R1 (istisna özelliklerini tip sisteminin bir parçası haline getirin)

  • P0510R0 (varyantlarda kısıtlamalar)

  • P0504R0 (isteğe bağlı / değişken / herhangi biri için etiketler)

  • P0497R0 (paylaşılan ptr tweaks)

  • P0508R0 (yapısal bağlantılar düğüm tutamaçları)

  • P0521R0 (paylaşılan işaretçi kullanım sayısı ve benzersiz değişiklikler?)

Spesifikasyon değişiklikleri:

Daha fazla referans:


2
Um, memory_order_consumeresmi olarak itiraz edilmiyor gibi görünüyor. Sadece notta önerilmez. Belki bundan bahsetmek mantıklıdır (örneğin, sondaki parantez ile)?
LF
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.