Apa saja fitur baru di C ++ 17?

1007

C ++ 17 sekarang fitur lengkap, jadi tidak mungkin mengalami perubahan besar. Ratusan proposal diajukan untuk C ++ 17.

Manakah dari fitur tersebut yang ditambahkan ke C ++ di C ++ 17?

Saat menggunakan kompiler C ++ yang mendukung "C ++ 1z", manakah dari fitur-fitur itu yang akan tersedia ketika kompiler memperbarui ke C ++ 17?

Yakk - Adam Nevraumont
sumber
26
Daftar lengkap fitur sesuai Dentang: perpustakaan , bahasa inti .
Kerrek SB
3
bost blog ini memiliki ringkasan yang bagus: bfilipek.com/2017/01/cpp17features.html
atb
13
Lihat dokumen resmi Perubahan antara C ++ 14 dan C ++ 17 DIS (P0636r0) untuk daftar perubahan besar dari C ++ 14 ke C ++ 17.
jotik
1
@RaghavNavada Hebat! Apakah bagian C ++ 20 dipertahankan? Ada # 53 , tapi sudah ditutup ...
LF
Segala sesuatu di situs ini en.cppreference.com/w/cpp ditandai dengan versi yang diperlukan.
jw_

Jawaban:

1266

Fitur bahasa:

Template dan Kode Generik

Lambda

Atribut

Pembersihan sintaksis

Pembersih multi-return dan kontrol aliran yang lebih bersih

  • Binding terstruktur

    • Pada dasarnya, kelas satu std::tiedenganauto
    • Contoh:
      • const auto [it, inserted] = map.insert( {"foo", bar} );
      • Membuat variabel itdan inserteddengan tipe deduced dari pairyang map::insertmengembalikan.
    • Bekerja dengan tuple / pair-like & std::arrays dan struct yang relatif datar
    • Sebenarnya bernama binding terstruktur dalam standar
  • if (init; condition) dan switch (init; condition)

    • if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
    • Memperluas if(decl)ke kasus-kasus di mana decltidak konversi-to-bool masuk akal.
  • Generalisasi berbasis rentang untuk loop

    • Tampaknya sebagian besar mendukung sentinel, atau mengakhiri iterator yang bukan tipe yang sama dengan iterator awalan, yang membantu dengan loop yang diakhiri null dan sejenisnya.
  • jika constexpr

    • Banyak fitur yang diminta untuk menyederhanakan kode yang hampir umum.

Lain-lain

Tambahan perpustakaan:

Tipe data

  • std::variant<Ts...>

    • Hampir-selalu tidak kosong terakhir saya periksa?
    • Jenis gabungan yang ditandai
    • {mengagumkan | bermanfaat}
  • std::optional

    • Mungkin memegang salah satu dari sesuatu
    • Sangat berguna
  • std::any

    • Memegang salah satu dari segalanya (yang dapat disalin)
  • std::string_view

    • std::string seperti referensi ke karakter array atau substring
    • Jangan pernah minum string const&lagi. Juga dapat membuat parsing bajillion kali lebih cepat.
    • "hello world"sv
    • constexpr char_traits
  • std::byte lebih dari yang mereka bisa mengunyah.

    • Bukan bilangan bulat atau karakter, hanya data

Meminta hal-hal

Sistem File TS v1

Algoritma baru

  • for_each_n

  • reduce

  • transform_reduce

  • exclusive_scan

  • inclusive_scan

  • transform_exclusive_scan

  • transform_inclusive_scan

  • Ditambahkan untuk tujuan threading, terbuka bahkan jika Anda tidak menggunakannya

Threading

(bagian) Dasar-Dasar Perpustakaan TS v1 tidak tercakup di atas atau di bawah

Perbaikan Kontainer

Penunjuk pintar berubah

stdPeningkatan tipe data lainnya :

Lain-lain

Sifat

Usang

Isocpp.org memiliki daftar perubahan independen sejak C ++ 14; sebagian telah dijarah.

Secara alami pekerjaan TS berlanjut secara paralel, jadi ada beberapa TS yang tidak cukup matang yang harus menunggu iterasi berikutnya. Target untuk iterasi berikutnya adalah C ++ 20 seperti yang direncanakan sebelumnya, bukan C ++ 19 karena beberapa rumor tersirat. C ++ 1O telah dihindari.

Daftar awal diambil dari posting reddit ini dan posting reddit ini , dengan tautan yang ditambahkan melalui googling atau dari halaman isocpp.org di atas.

Entri tambahan dijarah dari daftar uji fitur SD-6 .

Daftar fitur dentang dan daftar fitur pustaka selanjutnya dijarah. Ini tampaknya tidak dapat diandalkan, karena C ++ 1z, bukan C ++ 17.

slide ini memiliki beberapa fitur yang hilang di tempat lain.

Sementara "apa yang dihapus" tidak ditanyakan, berikut adalah daftar singkat beberapa hal ((kebanyakan?) Yang sudah usang sebelumnya yang dihapus dalam C ++ 17 dari C ++:

Dihapus:

Ada rewordings. Saya tidak yakin apakah ini berdampak pada kode, atau apakah itu hanya pembersihan dalam standar:

Makalah belum terintegrasi ke dalam:

  • P0505R0 (constexpr chrono)

  • P0418R2 (tweak atom)

  • P0512R0 (pengurangan templat argumen argumen)

  • P0490R0 (tweak mengikat terstruktur)

  • P0513R0 (perubahan ke std::hash)

  • P0502R0 (pengecualian paralel)

  • P0509R1 (memperbarui pembatasan penanganan pengecualian)

  • P0012R1 (jadikan spesifikasi pengecualian sebagai bagian dari sistem tipe)

  • P0510R0 (pembatasan varian)

  • P0504R0 (tag untuk opsional / varian / apa saja)

  • P0497R0 (berbagi ptr tweak)

  • P0508R0 (gagang simpul binding terstruktur)

  • P0521R0 (pointer menggunakan hitungan count dan perubahan unik?)

Perubahan spesifikasi:

Referensi lebih lanjut:

Yakk - Adam Nevraumont
sumber
2
Um, memory_order_consumesepertinya tidak secara resmi ditinggalkan. Itu hanya berkecil hati dalam catatan. Mungkin masuk akal untuk menyebutkan ini (dengan tanda kurung, misalnya)?
LF