C++17
Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den
version , der blev gennemgået den 5. maj 2021; checks kræver
17 redigeringer .
C++17 (også kendt som C++1z) er navnet på ISO /IEC-versionen af C++-standarden. Specifikationerne for C++17 blev offentliggjort i december 2017 [1] [2] .
Værdien af konstanten __cpluspluser blevet 201703L, denne bruges til betinget kompilering .
Fjernet eller forbudt
Fjernede trigrafer
Trigrafer blev brugt til maskiner med ikke-standard kodning og/eller begrænsede tastaturer. Tilbage i slutningen af 80'erne, med udbredelsen af 8-bit-kodninger og billige gummimembran- tastaturer, mistede trigrafer faktisk deres betydning, og tredive år senere blev de naturligvis udelukket [3] [4] .
// Vil den næste linje blive udført????????????????????/
a ++ ; /* med trigrafer er denne linje kommenteret ud - trigraf ??/ svarer til \ */
Fjernet registersøgeord
C-sproget var en "bærbar assembler": det gjorde det muligt at lave hurtige programmer, der kompilerer på forskellige computere, og det brugte også assembler-værktøjer ( linker , bibliotekar). Begreber som " headerfil " og " oversættelsesenhed " er ekkoer fra dengang.
Ordet registervar oprindeligt forbundet med den manuelle optimering af programmet. Moderne compilere "under motorhjelmen" foretager et stort antal optimeringer, og sådan manuel kontrol virker overflødig. Tilbage i C++11 blev ordet erklæret uønsket. Ordet er stadig reserveret og kan en dag blive brugt til et andet formål - som i C++11 [5] .
auto
Fjernet ++ operation for bool
Operationen er åbenlyst usikker og er forbudt i C++98 [6] . Operationen --mangler.
Fjernede erklærede undtagelser
Erklærede undtagelser void f() throw(A, B, C);, som f.eks. findes i Java , gør mere skade end gavn. Forbudt i C++11, fjernet i C++17. Forblev throw()som synonym for noexcept(true)[7] .
Fjernede typer og funktioner, der blev erstattet (og forbudt) i C++11
Blandt dem er std::auto_ptrgamle std::random_shufflefunktionelle adaptere [8] [9] .
I stedet bruges unique_ptr, shuffleog nye funktionsskabeloner baseret på function/ bind. Det hævdes, at enhver kode på auto_ptrmekanisk kan konverteres til unique_ptr, med en simpel tilføjelse std::move, hvor der sker overdragelse af ejerskab.
Separate dele iostreamforbudt i C++98 [10] er også blevet fjernet .
Fjernede konstruktører for std::funktion, der tog en allokator
Fem overbelastninger i alt, inklusive denne
skabelon < classAlloc > _
funktion ( std :: allocator_arg_t , const Alloc & alloc ) noexcept ;
På grund af uforståelig semantik og implementeringsvanskeligheder blev de fjernet uden forudgående forbud [11] .
Ekstremt sjældne funktioner i standardbiblioteket er forbudt
Flere sjældne funktioner i standardbiblioteket er forbudte: [12] [13] [14]
- allocator<void> - viste sig at være uanmeldt;
- nogle af funktionerne allocator er duplikeret af skabelonen allocator_traits;
- raw_storage_iterator - kalder ikke konstruktører og er derfor begrænset i anvendelse;
- get_temporary_buffer - har uoplagte faldgruber;
- is_literal_type - ubrugelig for generisk kode, men tilbage, så længe der er et begreb om "bogstavelig type" i C++;
- iterator - det er lettere at skrive iteratorer fra bunden end at bygge videre på det;
- codecvt - faktisk fungerede det meget dårligt, udvalget opfordrede til brug af specialiserede biblioteker;
- shared_ptr::unique() - på grund af upålidelighed i et flertrådet miljø.
De lover at fjerne dem helt i C++20.
Forbud relateret til nye C++17-funktioner
- result_of→ invoke_resulter en enklere syntaks baseret på C++11 type inferens [15] ;
- bool uncaught_exception()→ int uncaught_exceptions() - i behandlingen af en undtagelse kan systemet kaste en anden, så flere undtagelser kan "hænge" uhåndteret. At kontrollere, hvor mange af dem der var i konstruktøren, og hvor mange der var i destruktoren er en mere pålidelig og "gratis" metode set fra de tilgængelige bibliotekers synspunkt til at bestemme, om der skal kastes en undtagelse fra destruktoren [16] [ 17] [18] .
Fjernede C-biblioteksoverskrifter
Med overgangen til C11 vil header-filerne <ccomplex>, <cstdalign>, <cstdbool>, <ctgmath>. Filen <ciso646>er ikke forbudt [19] .
autox{}; opretter ikke længere en initializer_list
Den universelle initialisering, der er tilføjet i C++11 int x{};, giver dig mulighed for at oprette et objekt, en struktur, et array med én syntaks. I C++17 er det præciseret: hvis den i stedet for en type står , autoønsker brugeren at oprette ét objekt, og der er ikke behov for initializer_list.
Samtidig fortsætter den auto x = {1, 2, 3};med at skabe: på den ene side, for kompatibilitet med , på den anden side er der [20] [9]for (auto x : {1, 2, 3}) for ét objekt .
auto x = 1;
auto x1 = { 3 }; // std::initializer_list<int> auto x2 { 1 , 2 }; // fejl nu auto x3 { 3 }; // int
Globale ændringer
Undtagelsesspecifikationen er nu en del af typesystemet
Funktionerne og er nu funktioner med forskellige typer (men kan ikke danne et overbelastet sæt). Dette vil give API'en mulighed for at kræve tilbagekald , der ikke giver undtagelser, samt optimere koden for ingen [21] .
void f() noexcept(true);void f() noexcept(false);
Ny overjusteret
C++11 introducerede muligheden for at skabe datastrukturer, hvis tilpasning er større end teoretisk. Denne mulighed blev opfanget af den nye operation [22] .
klasse alignas ( 16 ) float4 {
flyder f [ 4 ];
};
float4 * p = new float4 [ 1000 ];
Der var en overbelastning af den nye operatør med en ekstra parameter for korrekt at allokere et overjusteret objekt i hukommelsen.
Obligatorisk bortskaffelse af kopiering
Betydningen af prvalue-begrebet er blevet ændret: nu er det kun en initialisering.
Mens koden SomeType a = 10;stadig kræver både konstruktøren og =-operatoren, er det kun konstruktøren, der med garanti bliver kaldt.
Det betyder, at funktioner kan returnere typer, der ikke kan kopieres og flyttes.
Strengere evalueringsrækkefølge
Nu bliver operationerne a.b, a->b, a->*b, a(b1, b2, b3), b += a(og analoger til andre operationer), a[b], a << bog a >> bevalueret i rækkefølgen a → b for at holde bivirkninger under kontrol [23] .
Hvis de kaldes som funktioner (f.eks. operator += (a, b)), forbliver rækkefølgen udefineret.
Udvidede begrebet "konstant i skabelonen"
Der er skabeloner, der accepterer en konstant.
skabelon < int N > struct Array
{
int a [ N ];
};
Hvad kan være et konstant N, og hvad kan ikke - erklæret det modsatte. En konstant i en skabelon kan ikke være en pegepind til et felt, et midlertidigt objekt, en strengliteral, et resultat typeideller en standardvariabel __func__[17] [24] ;
For kan have begyndelse og slutning af forskellige typer
Nu for (auto v : x)betyder , at tillade begyndelse og slutning af forskellige typer.
auto __begin = begin-expr; auto __end = end-expr;
Dette er grundlaget for iteration gennem intervallerne, som er et igangværende arbejde [25] .
Redaktionelle ændringer
Konceptet med en "kontinuerlig iterator"
Std::vector og std::string arrays beskæftiger sig med sammenhængende områder af hukommelsen. De introducerede begrebet "kontinuerlig iterator" [26] [27] . Konceptuelt har intet ændret sig.
De gav også definitioner til andre begreber - videresendelsesreference , standard medlemsinitialisering , skabelonentitet . Dette er arbejde med C++20
-koncepter .
Tegn u'x' og U'x', der ikke er kodet af et enkelt tegn, er forbudt
Tidligere var denne adfærd implementeringsdefineret.
Samtidig lavede de "UTF-8-tegn", der har en type og kan indeholde koder fra 0 til 127, svarende til UTF-8-strenge - tilsyneladende, så programmet er mindre afhængigt af lokalitetsindstillingerne på computeren [ 17] [28] .
char
Midlertidigt deaktiveret memory_order_consume
På grund af utilstrækkelig semantik blev "forbrug"-bestillingsmetoden verbalt (uden mærket ) forbudt, hvilket opfordrede til brug af "acquire"-metoden. Arbejdet med den nye semantik er stadig i gang, og måske vil forbuddet en dag blive ophævet [29] .
[[deprecated]]
Under alle omstændigheder, på PowerPC og ARM , vil alle downloads automatisk forbruge , men ikke alle vil erhverve , og forbrugsmetoden kan gemme ure i cross-platform-kode [30] .
Sprog
static_assert med et argument
Hvis static_assertdet ikke virker, er det ikke altid nødvendigt at fortælle programmøren, hvad der er galt - ofte kan han selv finde ud af det ud fra konteksten. [31] .
static_assert ( størrelse af ( wchar_t ) == 2 );
inline for globale variabler og konstanter
Nu kan du skrive i header-filen, og når denne fil inkluderes i cpp-filer, vil de alle referere til det samme objekt (klassekonstruktøren vil ikke blive kaldt gentagne gange for hver cpp-fil, i modsætning til eller ),
inline const ClassName INSTANCE_NAMEconst ClassName INSTANCE_NAMEstatic const ClassName INSTANCE_NAME
Nye standardanmærkninger
- [[fallthrough]]: i en af sektionerne af operatøren switch"falder vi bevidst igennem" til den næste. Mulig implementering af Duff-enheden
int n = ( antal + 7 ) / 8 ;
hvis ( ! tælle ) returnere ;
switch ( tæl % 8 ) {
tilfælde 0 : gør { * til = * fra ++ ; [[ nedfald ]];
tilfælde 7 : * til = * fra ++ ; [[ gennemfald ]];
tilfælde 6 : * til = * fra ++ ; [[ gennemfald ]];
tilfælde 5 : * til = * fra ++ ; [[ gennemfald ]];
tilfælde 4 : * til = * fra ++ ; [[ gennemfald ]];
tilfælde 3 : * til = * fra ++ ; [[ gennemfald ]];
tilfælde 2 : * til = * fra ++ ; [[ gennemfald ]];
tilfælde 1 : * til = * fra ++ ;
} while ( -- n > 0 );
}
- [[nodiscard]]: at kalde en funktion som en procedure betragtes som en fejl - for eksempel er det en "ren" funktion som string::empty()[32] , hvis eneste opgave er at returnere en værdi, eller en objektprotokol kræver, at der gøres noget med den returnerede værdi, som i unique_ptr::release(). I den senere C++20 -standard blev det muligt at angive en årsag til, at et opkald mislykkedes.
klasse SmartPtr { // egen implementering af unique_ptr public :
/// Overfører et administreret objekt til manuel kontrol
/// @return en pointer til et administreret objekt [[ nodiscard ]] Nyttelast * release ();
};
SmartPtr p ;
Nyttelast * data = p . frigivelse (); // korrekt brug af en smart pointer slette data ;
p . frigivelse (); // advarsel: ignorerer returværdien af 'SmartPtr::release()', erklæret med attributten nodiscard ( void ) p . frigivelse (); // sådan dæmper de advarslen
- [[maybe_unused]]: i en af kompileringstilstandene ( Windows / POSIX , debug/release) bruges dette eller hint element ikke, og dette er ikke en fejl.
// QString er altid UTF-16 og wstring er OS afhængig
skabelon < int Sz > void tilføj ( QString & s , unsigned long ch );
// Windows version, wstring = UTF-16
skabelon <> [[ maybe_unused ]] inline void tilføj < 2 > ( QString & s , unsigned long ch )
{ s . tilføj ( static_cast < uint16_t > ( ch ); }
// POSIX version, wstring = UTF-32
skabelon <> [[ måske_unused ]] void tilføj < 4 > ( QString & s , unsigned long ch )
{} // kodning af kodeposition i UTF-16, udelad for kortheds skyld
std :: wstring s = L " \U0001F60E " ; // smiley med briller QString r ;
// For kortheds skyld laver vi en nøjagtig kopi, og en sådan kompleks kode er ikke nødvendig.
// Men nogle gange er det nødvendigt i en form for bearbejdning - for eksempel uundgåelige tegn.
for ( auto c : s )
tilføje < størrelse af ( c ) > ( r , c );
Eller parameteren bruges ikke med vilje, men navnet efterlades til dokumentationsformål.
klasse ISoccerSeason { // offentlig grænseflade :
/// @pre begge hold deltager i denne sæson.
/// @return true, hvis der spilles en kamp mellem hjemme- og udehold /// @advarsel I en typisk fodboldsæson vil begge hold spille mod både hjemme- og udehold. virtual bool doTeamsPlay ([[ maybe_unused ]] const Team & home , [[ maybe_unused ]] const Team & away ) const { return true ; }
virtual ~ ISoccerSeason () = standard ;
};
Brug af typenavn i indlejrede skabeloner
Fejl i C++-sproget: i skabeloner typenameog classnogle steder ikke udskiftelige [33] .
skabelon < skabelon < typenavn > klasse X > struct C ; // OK skabelon < skabelon < typenavn > typenavn X > struct D ; // kompilerer ikke
Begge nøgleord er udtrykkeligt erklæret udskiftelige.
Strukturel sammenkædning
En ny måde at deklarere variabler til udpakning af komplekse objekter er dukket op, kaldet strukturel binding [34] .
auto [ sted , var Indsat ] = et kort . emplace ( nøgle , værdi );
Fungerer til par, tupler og andre typer, hvor .
std::get
Navneområde A::B post
Definition af indlejrede navnerum: [9] [35] namespace A::B {} som stenografi for namespace A { namespace B {} };
Annoteringer til navnerum og optegnede elementer
For eksempel:
enum klasse TriBool {
NEJ ,
måske ,
JA ,
NN [[ måske_ubrugt ]],
USPECIFICERET [[ forældet ( "Omdøbt til MÅSKE" )]] = MÅSKE
};
constexpr int TriBool_N = static_cast < int > ( TriBool :: NN );
const char * triBoolNames [ TriBool_N ] = { "nej" , "måske" , "ja" };
Der er endnu ikke et erklæret mål [17] [36] , men dette vil give compiler-udviklere mulighed for at komme med et - for eksempel erklære, at NN-elementet er specielt og ikke behøver at blive tildelt variabler, behandlet i switch.
Hvis ved kompilering
SFINAE - konceptet gjorde det muligt at lave en simpel skabelon enable_if, der giver forskellig funktionalitet til forskellige typer, men giver tung kode. I C++17 kan du forenkle programmet: operatoren if constexpr(expression)instansierer koden, hvis udtrykket i parentes er sandt [37] .
skabelon < classT > _
constexpr T absolut ( T arg ) {
returner arg < 0 ? - arg : arg ;
}
skabelon < classT > _
constexpr auto precision_threshold = T ( 0,000001 );
skabelon < classT > _
constexpr bool tæt_nok ( T a , T b ) {
hvis constexpr ( er_flydende_v < T > ) // << !! returner absolut ( a - b ) < præcision_tærskel < T > ;
andet
returnere a == b ;
}
I dette tilfælde sørger vi for, at forskellen mellem brøktal er lille, og heltal kontrolleres blot for lighed.
Forenklet syntaks for binær operation i variable skabeloner
Pakkede udtryk [17] [38] :
skabelon < typename ... As > bool foo ( As ... args )
{ return ( args && ...); }
Hexadecimal repræsentation af brøktal
Hexadecimal mantisse og decimaleksponent: 0xC.68p+2, 0x1.P-126, svarende til substitution %a. C har understøttet denne syntaks siden version 99 [39] .
Lokal variabel initialisering i if/switch
Svarende til initialisering af lokale variabler i for, gør koden mere kompakt [40] .
if ( auto it = m . find ( key ); it != m . end ()) returner det -> sekund ;
Brug i attributter
// Var
ugyldig f () {
[[ rpr :: kernel , rpr :: target ( cpu , gpu )]] // gentag do_task ();
}
// Blev
ugyldig f () {
[[ bruger rpr : kerne , mål ( cpu , gpu )]]
udføre_opgave ();
}
Typeløse parametre i skabeloner
Giver dig mulighed for at indstille skabelonparametre af enhver type via [41] .
auto
skabelon < auto X > struct B { static constexpr auto value = X ; };
B < 5 > b1 ; // OK: skabelonparametertypen er int B < 'a' > b2 ; // OK: skabelonparametertypen er char B < 2,5 > b3 ; // fejl: skabelonparametertypen kan ikke være dobbelt
Indfanger lambda-objekt *dette
var :. Det blev til: [42] .
[self = *this]{ self.f(); }[*this]{ f(); }
Du kan initialisere en enum-klasse med et nummer
enum classnogle gange bruges til at gøre en anden heltalstype ikke kompatibel med noget. Nu kan variabler af denne type initialiseres med tal [43]
enum klasse Håndtag : intptr_t { UGYLDIG = 0 };
Håndtag h { 42 };
Håndtag h = 42 ; // forbudt
Bibliotek
Mindre forbedringer af biblioteket
- Ikke-konstant overbelastning string::data. Bruges til at kalde strengfunktioner på lavt niveau, der tager et stykke hukommelse af en vis længde og fylder det med tegn (f.eks. WinAPI ). Før C++11 blev det brugt const_cast<char*>(x.data()), før C++17 var det &x.front().
- emplace_backet element returnerer en reference. Giver dig mulighed for at skrive noget som dette:
v . emplace_back ( "alfa" , "bravo" ). gøre Noget ();
- C-standardbiblioteket er blevet opdateret fra C99 til C11 [44] .
- Funktioner std::size(x), std::begin(x), std::end(x), std::empty(x). Giver dig mulighed for at skrive fælles boilerplate-kode for STL-beholdere og arrays [26] [45] . Derudover er std:: størrelse en nødvendig funktion, som ofte blev skrevet for sig selv med fejl.
- Tilføjet delvis specialisering [46]bool_constant<bool B> = integral_constant<bool, B>;
- Tilføjede egenskabsfunktioner for SFINAE : , , , , (sammensat type), (trivielt kopierbart objekt, og alle to objekter med samme værdi har den samme interne repræsentation).is_swappableis_nothrow_swappableis_swappable_withis_nothrow_swappable_withis_aggregatehas_unique_object_representations
- Udvidet bibliotek til at arbejde med uinitialiseret hukommelse. Der er funktioner , , , , , samt deres versioner for n elementer.uninitialized_default_constructuninitialized_value_constructuninitialized_movedestroydestroy_at
- Ny skabelon . Forenkler oprettelsen af SFINAE- skabeloner, der kan udvides, hvis type T eksisterer [47] .void_t<T> = void
- For tilføjet version med finderobjekt. Der er tre søgeprogrammer som standard: Protozoan, Boyer-Moore og Boyer-Moore-Horspool .std::search
- Den nye funktion initialiserer type T med data fra en tupel.make_from_tuple
- Den nye konstant bestemmer, om den atomare variabel er ikke-blokerende .atomic::is_always_lock_free
- Tilføjede funktioner til at runde op, ned og til nærmeste .chrono
- Vi tilføjede funktionerne til at droppe ( ) og udtrække ( ) elementer.map/setmergeextract
- Tilføjet type .shared_ptr<T>::weak_type = weak_ptr<T>
- I nogle tilfælde kan tildelere have en ufuldstændig type. Nu rekursive strukturer som . Store compilere har understøttet dette i lang tid, det er kun tilbage at specificere det.struct X { std::vector<X> data; };
- Tilføjede implicitte konstruktører til og .pairtuple
- unique_ptr/shared_ptrkan arbejde med C-stil arrays ( ). I C++14 var det nødvendigt at trække den korrekte slettefunktion ( ).shared_ptr<string[]>(new string[n])shared_ptr<string[]>(new string[n], default_delete<string[]>() )
- Arbejdet [48] [49] er blevet forfinet .common_type
Ny type std::string_view
Det sker ofte, at du skal sende en uændret streng til en anden sektion af kode, dette kan gøres ved hjælp af følgende metoder:
void doSmth ( const char * s ); // hvad hvis der er et nul-tegn i strengen? Ja, og indersiden af funktionen bliver fejlagtig void doSmth ( const std :: string & s ); // hvad hvis strengen ikke er en streng, og vi skal allokere hukommelse?
C++17 introducerede en type string_view —en streng, der kun har en pointer og en længde, intet ejerskab, ingen hukommelsesstyring og ikke engang afsluttende null — og så har den ikke en c_str(). Kun kanter (begyndelse/længde) kan ændres, ikke tegn. Programmørens opgave er at sikre, at objektet ikke overlever den hukommelsesbuffer, hvor strengen er gemt, og at sende parametre er en stor brug for det. Objektet string_viewer meget lille (2 bit maskine) og skal videregives efter værdi i stedet for ved reference.
string_viewi sig selv er en abstraktion - den abstraherer strenglagringsmetoden, hvilket kun kræver én ting - at tekstdataene er fortløbende bytes i hukommelsen. Kun komplekse usædvanlige strukturer (for eksempel slynge/reb ) gemmer tilfældige strenge. Og alle de andre - og , og , og forskellige slags arrays - konverteres til .
stringconst char*string_view
Cache linjestørrelse
Der er to nye konstanter, hardware_constructive_interference_sizeog hardware_destructive_interference_size. Således kan brugeren undgå falsk deling (destruktiv interferens) og forbedre lokaliteten (konstruktiv interferens).
struct keep_apart {
alignas ( hardware_destructive_interference_size ) atomic < int > kat ;
alignas ( hardware_destructive_interference_size ) atomic < int > hund ;
// kat er langt fra hund, de kan ændres fra forskellige tråde.
};
struct -together {
atomic < int > hund ;
int hvalp ;
};
struct kennel {
//...
alignas ( størrelse på ( sammen )) sammen pakke ;
//...
};
static_assert ( størrelse på ( sammen ) <= hardware_constructive_interference_size );
// sørg for sammen er en cache linje.
Teoretisk set burde begge konstanter være ens, men for at understøtte heterogene arkitekturer blev det besluttet at lave to konstanter. [halvtreds]
Den nye shared_mutex-type
En mutex, der giver dig mulighed for at læse parallelt og skrive til en [51] . Blokkere for det hedder shared_lockog unique_lock.
Automatisk registrering af containerparametertype
Funktioner dukkede op i biblioteket, de såkaldte fradragsvejledninger , så du kan gøre dette:
std :: par p ( 2 , 4,5 ); // en
std :: vektor < int > v = { 1 , 2 , 3 , 4 };
std :: vektor x ( v.begin ( ), v . end ( ) ) ; // 2
Nye funktioner til indsættelse i et associativt array med en ikke-gentaget tast
For std::mapog std::unordered_mapto nye funktioner er tilføjet [52] .
#include <iostream>
#include <kort>
klassepar { _
offentligt :
int værdi1 , værdi2 ;
Par () : værdi1 ( 0 ), værdi2 ( 0 ) {}
eksplicit par ( int aValue1 ) : værdi1 ( aValue1 ), værdi2 ( 0 ) {}
Par ( int aValue1 , int aValue2 )
: værdi1 ( aValue1 ), værdi2 ( aValue2 ) {}
};
int main ()
{
std :: map < std :: streng , par > m ;
// C++11
m [ "a" ] = Par ( 3 , 4 );
m . emplace ( "a" , 1 ); // Par oprettes altid
// C++17
m . insert_or_assign ( "a" , Par ( 3 , 4 ));
m . try_emplace ( "a" , 1 ); // Par oprettes efter behov
returnere 0 ;
}
Nye matematiske funktioner
Ikke-standard matematiske funktioner er blevet introduceret i std navnerummet: beta, , , , , , , , , , , [53] [54] . Der er ingen uden for std (in ).
cyl_bessel_i/j/kcyl_neumann[comp_]ellint_1/2/3expinthermite[assoc_]laguerre[assoc_]legendreriemann_zetasph_besselsph_legendresph_neumannmath.h
Fra den første sætning (2010): "Vi håber, at vedtagelsen af dette forslag vil sende et budskab til de forskellige computerfællesskaber om, at C++ på trods af populær overbevisning også er ganske velegnet til deres branche." Så blev han ikke accepteret. Nu har de store biblioteksleverandører ( Dinkumware , Boost , GCC ) allerede disse funktioner.
Også tilføjet beregning af GCD [55] og LCM [56] , funktionen af reduktion til området ( ) [57] , tredimensionel hypotenuse .
clamphypot(x, y, z)
Filsystembibliotek
Et filsystembibliotek baseret på boost::filesystemlader dig: [58]
- automatisk internationalisering af filnavne afhængigt af operativsystemets funktioner. Biblioteket skjuler den kodning, som det fungerer i, og konverterer selv navnene til det ønskede - i det mindste til den lokalitetsdefinerede one-byte og forskellige Unicode-varianter;
- kataloggennemgang (herunder rekursiv);
- definition af filtyper (almindelig, mappe , socket ...);
- opdeling af stien til filen i komponenter: drev, mappe, navn og udvidelse;
- oprettelse af mapper, kopiering af filer, sletning af mapper og filer (inklusive rekursive);
- få navne til midlertidige filer .
Variable typer
Der var en klasse, der kunne indeholde data af enhver type [59] [60] . Implementeringer er nødvendige for at passe små objekter uden at allokere hukommelse. Funktionen kræver et nøjagtigt match af typen, og vil ikke give noget, hvis det er inde i .
std::anyanyany_castany_cast<double>int
std :: cout << std :: boolalpha ;
std :: enhver a = 1 ;
std :: cout << a . type (). navn () << ": " << std :: any_cast < int > ( a ) << std :: endl ;
a = 3,14 ;
std :: cout << a . type (). navn () << ": " << std :: any_cast < double > ( a ) << std :: endl ;
a = sand ;
std :: cout << a . type (). navn () << ": " << std :: any_cast < bool > ( a ) << std :: endl ;
// i: 1
// d: 3,14
// b: sand
Der er også enklere std::variant<int, bool, double>og std::optional<T>.
Lavt niveau tal-til-tekst konvertering funktioner
En kendt ulempe ved C++: for lav-niveau konvertering af tal til tekst uden hukommelse allokering, er du nødt til at køre en tung og upålidelig sprintfen, og den indbyggede konvertering af tekst til et tal tilbage med C er ret upålidelig.
Nu er der indbygget lokal-uafhængige superhastigheder from_chars[61] og to_chars[62] . De er designet på en sådan måde, at de ikke kræver (og ikke producerer) et slutnul og kan fungere f.eks. på string_view. På grund af deres begrænsninger og lokale uafhængighed er de primært beregnet til JSON og XML , hvor der er brug for en enorm hastighed.
Ny type polymorphic_allocator
STL-datastrukturer ( strenge , vektorer osv.) indeholder en skabelonparameter - en hukommelsesallokator. Denne allokator fungerer som et generisk programmeringskoncept , ikke som en objektorienteret grænseflade: allokering af hukommelse på heapen og poolen resulterer i forskellige inkompatible typer. En klasse er en standardstart for en sjælden opgave: afhængigt af nogle forhold, alloker hukommelse enten på dyngen eller i poolen.
polymorphic_allocator
I sig selv er det ikke en grænseflade, men den er forbundet med en grænseflade .
polymorphic_allocatormemory_resource
Ny skabelon std::invoke
Tillader konsekvent kald af funktioner, objekter med ()-operatoren ( functors ) og lambda-objekter [63] . Også tilføjede funktioner , , .
is_invocableis_invocable_rinvoke_result
Parallelle versioner af STL-algoritmer
For 69 algoritmer fra , og parallelle versioner er blevet opfundet [64] [65] [66] .
<algorithm><numeric><memory>
Se også
Links
- Udkast til standard, N4659 , dateret 21/03/2017
Noter
- ↑ ISO/IEC 14882:2017 . Hentet 4. december 2017. Arkiveret fra originalen 17. maj 2013. (ubestemt)
- ↑ Nylige milepæle: C++17 er næsten færdig med funktioner, anden runde af TS'er er nu under udvikling . Hentet 28. marts 2016. Arkiveret fra originalen 8. september 2020. (ubestemt)
- ↑ N3981: Fjernelse af trigrafer??! (Richard Smith) (6. maj 2014). Hentet 28. marts 2016. Arkiveret fra originalen 9. juli 2018. (ubestemt)
- ↑ IBM-kommentar om forberedelse til en Trigraph-adverse future i C++17 Arkiveret 11. september 2018 på Wayback Machine , IBM-papir N4210, 2014-10-10.
- ↑ Fjern forældet brug af registerets nøgleord . Hentet 20. august 2018. Arkiveret fra originalen 14. september 2017. (ubestemt)
- ↑ Fjern forældet operator++(bool) . Hentet 20. august 2018. Arkiveret fra originalen 11. september 2017. (ubestemt)
- ↑ Fjernelse af forældede undtagelsesspecifikationer fra C++17 . Hentet 20. august 2018. Arkiveret fra originalen 13. september 2017. (ubestemt)
- ↑ N4190: Fjerner auto_ptr, random_shuffle(), And Old <functional> Stuff (Stephan T. Lavavej) . Hentet 28. marts 2016. Arkiveret fra originalen 20. oktober 2017. (ubestemt)
- ↑ 1 2 3 Opdateringer til min turrapport . Dato for adgang: 28. marts 2016. Arkiveret fra originalen 19. marts 2015. (ubestemt)
- ↑ Fjern forældede iostreams aliaser . Hentet 20. august 2018. Arkiveret fra originalen 22. august 2017. (ubestemt)
- ↑ Fjernelse af fordelerstøtte i std::funktion (rev 1) . Hentet 20. august 2018. Arkiveret fra originalen 17. september 2017. (ubestemt)
- ↑ Afskrivning af vestigiale biblioteksdele i C++17 . Hentet 20. august 2018. Arkiveret fra originalen 13. september 2017. (ubestemt)
- ↑ Udfase <codecvt> . Hentet 20. august 2018. Arkiveret fra originalen 16. september 2017. (ubestemt)
- ↑ Foreslået resolution for CA 14 (shared_ptr use_count/unique) . Hentet 20. august 2018. Arkiveret fra originalen 7. juli 2017. (ubestemt)
- ↑ Løsning af GB 55, US 84, US 85, US 86 . Hentet 20. august 2018. Arkiveret fra originalen 5. juli 2017. (ubestemt)
- ↑ N4259: Ordlyd for std::uncaught_exceptions (Herb Sutter) . Hentet 28. marts 2016. Arkiveret fra originalen 29. november 2014. (ubestemt)
- ↑ 1 2 3 4 5 Nye kernesprogspapirer vedtaget til C++17 . Hentet 28. marts 2016. Arkiveret fra originalen 27. april 2015. (ubestemt)
- ↑ Kilde . Hentet 31. maj 2022. Arkiveret fra originalen 16. november 2017. (ubestemt)
- ↑ C++17 bør referere til C11 i stedet for C99 . Hentet 20. august 2018. Arkiveret fra originalen 13. september 2017. (ubestemt)
- ↑ N3922: Nye regler for automatisk fradrag fra braced-init-liste (James Dennett) . Hentet 28. marts 2016. Arkiveret fra originalen 10. august 2015. (ubestemt)
- ↑ Få undtagelsesspecifikationer til at være en del af typesystemet . Hentet 20. august 2018. Arkiveret fra originalen 12. september 2017. (ubestemt)
- ↑ Dynamisk hukommelsesallokering til overjusterede data . Hentet 20. august 2018. Arkiveret fra originalen 8. september 2017. (ubestemt)
- ↑ [ http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0145r3.pdf Refining Expression Evaluation Order for Idiomatic C++] . Hentet 23. august 2018. Arkiveret fra originalen 26. august 2018. (ubestemt)
- ↑ N4268: Tillad konstant evaluering for alle ikke-type skabelonargumenter (Richard Smith) . Hentet 28. marts 2016. Arkiveret fra originalen 12. marts 2016. (ubestemt)
- ↑ Generalisering af den rækkevidde-baserede for loop . Hentet 23. august 2018. Arkiveret fra originalen 5. oktober 2017. (ubestemt)
- ↑ 1 2 Nye standardbibliotekspapirer vedtaget til C++17 . Hentet 28. marts 2016. Arkiveret fra originalen 29. november 2014. (ubestemt)
- ↑ N4284: Sammenhængende iteratorer (Jens Maurer) . Hentet 28. marts 2016. Arkiveret fra originalen 29. november 2014. (ubestemt)
- ↑ N4267: Tilføjelse af u8-karakterer (Richard Smith) . Hentet 28. marts 2016. Arkiveret fra originalen 28. oktober 2015. (ubestemt)
- ↑ Afskrække midlertidigt memory_order_consume . Hentet 20. august 2018. Arkiveret fra originalen 16. januar 2018. (ubestemt)
- ↑ Formålet med memory_order_consume i C++11 . Hentet 15. august 2019. Arkiveret fra originalen 11. november 2019. (ubestemt)
- ↑ N3928: Udvider static_assert, v2 (Walter E. Brown) . Hentet 28. marts 2016. Arkiveret fra originalen 11. august 2015. (ubestemt)
- ↑ Således klagede forfatterne af PVS-Studio ofte over en fejl: programmøren clear()skrev empty().
- ↑ N4051: Tillad typenavn i en skabelonskabelonparameter (Richard Smith) . Hentet 28. marts 2016. Arkiveret fra originalen 11. august 2015. (ubestemt)
- ↑ Struktureret bindende erklæring (siden C++17) Arkiveret 8. september 2020 på Wayback Machine en.cppreference.com
- ↑ N4230: Indlejret navneområde definition (Robert Kawulak, Andrew Tomazos) . Hentet 28. marts 2016. Arkiveret fra originalen 3. august 2015. (ubestemt)
- ↑ N4266: Attributter til navnerum og tællere (Richard Smith) . Dato for adgang: 28. marts 2016. Arkiveret fra originalen 6. marts 2016. (ubestemt)
- ↑ constexpr if: En lidt anderledes syntaks . Hentet 20. august 2018. Arkiveret fra originalen 7. oktober 2017. (ubestemt)
- ↑ N4295: Foldeudtryk (Andrew Sutton, Richard Smith) . Hentet 28. marts 2016. Arkiveret fra originalen 4. april 2015. (ubestemt)
- ↑ Hexadecimale flydende bogstaver for C++ . Hentet 12. juni 2019. Arkiveret fra originalen 22. august 2017. (ubestemt)
- ↑ Udvalgssætninger med initialisering . Hentet 12. juni 2019. Arkiveret fra originalen 6. oktober 2017. (ubestemt)
- ↑ Erklæring af ikke-type skabelonparametre med auto . Hentet 7. august 2020. Arkiveret fra originalen 16. september 2017. (ubestemt)
- ↑ Lambdafangst af *dette efter værdi som [=,*dette ] . Hentet 7. august 2020. Arkiveret fra originalen 22. august 2017. (ubestemt)
- ↑ Konstruktionsregler for enum-klasseværdier . Hentet 7. august 2020. Arkiveret fra originalen 9. december 2017. (ubestemt)
- ↑ C++17 bør referere til C11 i stedet for C99 . Hentet 18. december 2016. Arkiveret fra originalen 13. november 2016. (ubestemt)
- ↑ N4280: Ikke-medlem størrelse() og mere (Riccardo Marcangelo) . Dato for adgang: 28. marts 2016. Arkiveret fra originalen 9. marts 2015. (ubestemt)
- ↑ Ordlyd for bool_constant, revision 1 . Hentet 1. januar 2020. Arkiveret fra originalen 14. oktober 2017. (ubestemt)
- ↑ Arkiveret kopi . Hentet 1. januar 2020. Arkiveret fra originalen 28. august 2017. (ubestemt)
- ↑ Arkiveret kopi . Hentet 1. januar 2020. Arkiveret fra originalen 10. oktober 2017. (ubestemt)
- ↑ Arkiveret kopi . Hentet 1. januar 2020. Arkiveret fra originalen 5. juli 2017. (ubestemt)
- ↑ P0154R1 constexpr std::hardware_{constructive,destructive}_interference_size . (ubestemt)
- ↑ std::shared_mutex - cppreference.com . Hentet 30. august 2019. Arkiveret fra originalen 30. august 2019. (ubestemt)
- ↑ Forbedret indsættelsesgrænseflade for std::{unordered_,}map (revideret) . Hentet 28. marts 2016. Arkiveret fra originalen 27. april 2015. (ubestemt)
- ↑ Arkiveret kopi . Hentet 20. august 2019. Arkiveret fra originalen 17. september 2019. (ubestemt)
- ↑ Matematiske specialfunktioner til C++17, v5 . Hentet 28. marts 2016. Arkiveret fra originalen 5. april 2016. (ubestemt)
- ↑ std::gcd - cppreference.com . Hentet 30. august 2019. Arkiveret fra originalen 28. marts 2019. (ubestemt)
- ↑ std::lcm - cppreference.com . Hentet 30. august 2019. Arkiveret fra originalen 28. marts 2019. (ubestemt)
- ↑ std::clamp - cppreference.com . Hentet 30. august 2019. Arkiveret fra originalen 30. august 2019. (ubestemt)
- ↑ Filsystembiblioteksforslag (Beman Dawes) . Hentet 28. marts 2016. Arkiveret fra originalen 20. juli 2016. (ubestemt)
- ↑ C++ Extensions for Library Fundamentals, Version 2, Working Draft . Hentet 30. august 2019. Arkiveret fra originalen 25. august 2019. (ubestemt)
- ↑ std::any - cppreference.com . Hentet 30. august 2019. Arkiveret fra originalen 30. august 2019. (ubestemt)
- ↑ std::from_chars - cppreference.com . Hentet 30. august 2019. Arkiveret fra originalen 30. august 2019. (ubestemt)
- ↑ std::to_chars - cppreference.com . Hentet 30. august 2019. Arkiveret fra originalen 30. august 2019. (ubestemt)
- ↑ Et forslag til tilføjelse af aktiveringsfunktionsskabelon (revision 1) . Hentet 1. januar 2020. Arkiveret fra originalen 6. oktober 2017. (ubestemt)
- ↑ Udvidelser til parallelisme - cppreference.com . Hentet 5. februar 2021. Arkiveret fra originalen 12. november 2020. (ubestemt)
- ↑ Parallelisme TS bør standardiseres . Hentet 28. marts 2016. Arkiveret fra originalen 5. april 2016. (ubestemt)
- ↑ Brug af C++17 parallelle algoritmer for bedre ydeevne | C++ teamblog . Hentet 5. februar 2021. Arkiveret fra originalen 24. januar 2021. (ubestemt)
C programmeringssprog |
---|
|
Kompilere |
|
---|
Biblioteker |
|
---|
Ejendommeligheder |
|
---|
Nogle efterkommere |
|
---|
C og andre sprog |
|
---|
Kategori:C programmeringssprog |
C++ |
---|
|
Ejendommeligheder |
|
---|
Nogle biblioteker |
|
---|
Kompilere |
|
---|
påvirket |
|
---|
|