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?
Jawaban:
Fitur bahasa:
Template dan Kode Generik
Pengurangan argumen templat untuk templat kelas
template <auto>
Perbaikan argumen template non-tipe
template<template<class...>typename bob> struct foo {}
(Lipat + ... + ekspresi) dan Revisi
auto x{8};
adalahint
memodernisasi
using
dengan...
dan daftarLambda
lambda constexpr
Menangkap
*this
dalam lambdas[*this]{ std::cout << could << " be " << useful << '\n'; }
Atribut
[[fallthrough]]
,[[nodiscard]]
,[[maybe_unused]]
Atribut[[attributes]]
padanamespace
s danenum { erator[[s]] }
using
dalam atribut untuk menghindari keharusan mengulangi namespace atribut.Compiler sekarang diminta untuk mengabaikan atribut non-standar yang tidak mereka kenali .
Pembersihan sintaksis
Variabel sebaris
namespace A::B
Sederhana
static_assert(expression);
tanpa stringtidak
throw
kecualithrow()
, danthrow()
memangnoexcept(true)
.Pembersih multi-return dan kontrol aliran yang lebih bersih
Binding terstruktur
std::tie
denganauto
const auto [it, inserted] = map.insert( {"foo", bar} );
it
daninserted
dengan tipe deduced daripair
yangmap::insert
mengembalikan.std::array
s dan struct yang relatif datarif (init; condition)
danswitch (init; condition)
if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
if(decl)
ke kasus-kasus di manadecl
tidak konversi-to-bool masuk akal.Generalisasi berbasis rentang untuk loop
jika constexpr
Lain-lain
Literal float point heksadesimal
Alokasi memori dinamis untuk data yang terlalu selaras
Salinan salinan dijamin
Memperbaiki urutan evaluasi untuk (beberapa) ekspresi dengan beberapa modifikasi
.then
pekerjaan di masa depanDaftar langsung-inisialisasi enum
Maju jaminan kemajuan (FPG) (juga, FPG untuk algoritma paralel )
u8'U', u8'T', u8'F', u8'8'
literal karakter (string sudah ada)"noexcept" dalam sistem tipe
__has_include
Array perbaikan konversi pointer
perbaikan konstruktor bawaan untuk beberapa kasus sudut (lihat P0136R0 untuk contoh perubahan perilaku)
inisialisasi agregat dengan warisan .
std::launder
, ketik punning, dllTambahan perpustakaan:
Tipe data
std::variant<Ts...>
std::optional
std::any
std::string_view
std::string
seperti referensi ke karakter array atau substringstring const&
lagi. Juga dapat membuat parsing bajillion kali lebih cepat."hello world"sv
char_traits
std::byte
lebih dari yang mereka bisa mengunyah.Meminta hal-hal
std::invoke
std::apply
std::make_from_tuple
,std::apply
diterapkan pada konstruksi objekis_invocable
,is_invocable_r
,invoke_result
result_of
is_invocable<Foo(Args...), R>
adalah "dapat Anda meneleponFoo
denganArgs...
dan mendapatkan sesuatu yang kompatibel denganR
", di manaR=void
adalah default.invoke_result<Foo, Args...>
adalahstd::result_of_t<Foo(Args...)>
tetapi tampaknya kurang membingungkan?Sistem File TS v1
[class.path]
[class.filesystem.error]
[class.file_status]
[class.directory_entry]
[class.directory_iterator]
dan[class.recursive_directory_iterator]
[fs.ops.funcs]
fstream
s dapat dibuka denganpath
s, serta denganconst path::value_type*
string.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
std::shared_mutex
atomic<T>
::is_always_lockfree
scoped_lock<Mutexes...>
std::lock
rasa sakit saat mengunci lebih dari satu mutex pada suatu waktu.Paralelisme TS v1
std
Algoritma versi paralel , dan mesin terkaitperangkat keras _ * _ gangguan_ukuran
(bagian) Dasar-Dasar Perpustakaan TS v1 tidak tercakup di atas atau di bawah
[func.searchers]
dan[alg.search]
[pmr]
std::function
untuk pengalokasistd::sample
, mengambil sampel dari suatu rentang?Perbaikan Kontainer
try_emplace
daninsert_or_assign
Penyambungan untuk
map<>
,unordered_map<>
,set<>
, danunordered_set<>
non-const
.data()
untuk string.non-anggota
std::size
,std::empty
,std::data
std::begin
/end
Dukungan jenis minimal tidak lengkap dalam wadah
"Konsep" iterator yang berdekatan
constexpr
iteratorThe
emplace
keluarga fungsi sekarang mengembalikan referensi ke objek dibuat .Penunjuk pintar berubah
unique_ptr<T[]>
perbaikan danunique_ptr
tweak lainnya .weak_from_this
dan beberapa diperbaiki untuk dibagikan dari inistd
Peningkatan tipe data lainnya :{}
pembangunanstd::tuple
dan perbaikan lainnyaLain-lain
Pustaka C ++ 17 didasarkan pada C11 dan bukan C99
Dicadangkan
std[0-9]+
untuk perpustakaan standar masa depandestroy(_at|_n)
,uninitialized_move(_n)
,uninitialized_value_construct(_n)
,uninitialized_default_construct(_n)
std
implementasi terbukastd::clamp()
std::clamp( a, b, c ) == std::max( b, std::min( a, c ) )
kurang lebihgcd
danlcm
std::uncaught_exceptions
std::as_const
std::bool_constant
_v
variabel templatestd::void_t<T>
std::owner_less<void>
std::less<void>
, tetapi untuk pointer pintar untuk mengurutkan berdasarkan kontenstd::chrono
Polandiastd::conjunction
,std::disjunction
,std::negation
Terkenastd::not_fn
std
std :: default_order , tipuan berakhir( istirahat ABI dari beberapa kompiler karena nama mangling, dihapus.)std::less
.Sifat
Usang
<codecvt>
memory_order_consume
result_of
, digantikan denganinvoke_result
shared_ptr::unique
, itu tidak terlalu threadsafeIsocpp.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:
register
, kata kunci dicadangkan untuk penggunaan di masa mendatangbool b; ++b;
<functional>
barang lama ,random_shuffle
std::function
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:
makalah yang dikelompokkan berdasarkan tahun; tidak semua diterima
https://isocpp.org/files/papers/p0636r0.html
sumber
memory_order_consume
sepertinya tidak secara resmi ditinggalkan. Itu hanya berkecil hati dalam catatan. Mungkin masuk akal untuk menyebutkan ini (dengan tanda kurung, misalnya)?