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?


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:


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.