Podpora funkcí C++11 (moderní jazyk C++)
Tento článek popisuje funkcí C ++ 11 v jazyce Visual C++.
V tomto článku
Seznam 11 funkcí c ++
Tabulka funkce základní jazyk
Základní tabulka funkce jazyk: souběžnosti
Základní tabulka funkce jazyk: C99
Příručka k funkcí tabulky
Odkazy rvalue
Lambda výrazy
decltype
Výčty se deklarován zadaný a vpřed
Zarovnání
Standardní rozložení a Trivial typy
Přednastavené a odstraněné funkce
přepsání a finální
Atomics a další
C99 __func__ a preprocessor pravidla
Standardní funkce knihovny
Seznam funkcí C++ 11
Visual C++ v sadě Visual Studio 2010 implementována mnoho funkcí systému C ++ 11 jádra specifikace jazyka, a Visual C++ v sadě Visual Studio 2012 Přidat některých z nich.Visual C++ v sadě Visual Studio 2013 Rozbalí toto pokrytí ještě víc a také podporuje některé 14 C ++ funkce knihovny.V následující tabulce jsou uvedeny základní funkce jazyka C++11 a stav jejich implementace v rámci jazyka Visual C++ v aplikaci Visual Studio 2010, Visual C++ v sadě Visual Studio 2012 a Visual C++ v sadě Visual Studio 2013.
Tabulka základních funkcí jazyka C++11
Visual Studio 2010 |
Visual Studio 2012 |
Visual Studio 2013 |
|
---|---|---|---|
v2.0 |
v2.1* |
v2.1* |
|
Ne |
Ne |
Ne |
|
Ne |
Ne |
||
Ne |
Ne |
||
Ne |
Ne |
||
Ano |
Ano |
Ano |
|
v1.0 |
v1.0 |
v1.0 |
|
Ano |
Ano |
Ano |
|
v1.0 |
v1.1 |
v1.1 |
|
v1.0 |
v1.1** |
v1.1 |
|
Ano |
Ano |
Ano |
|
Ne |
Ne |
Ano |
|
Ne |
Ne |
Ne |
|
Ne |
Ne |
||
Ano |
Ano |
Ano |
|
Ano |
Ano |
Ano |
|
Částečné |
Ano |
Ano |
|
Ne |
Ano |
Ano |
|
Ne |
Ne |
Ne |
|
Ne |
Ne |
Ne |
|
TR1 |
Částečné |
Částečné |
|
Ne |
Ne |
||
Ne |
Ne |
Ne |
|
Ne |
Ne |
Ano |
|
Ne |
Ne |
Ne |
|
Ne |
Ne |
Ne |
|
Ne |
Ne |
||
Ne |
Ne |
Ne |
|
Ne |
Ne |
Ne |
|
Ne |
Ano |
Ano |
|
Ne |
Ne |
||
Ano |
Ano |
Ano |
|
Ne |
Ne |
Ne |
|
Ne |
Ne |
Ne |
|
Ne |
Ne |
Ne |
|
Ano |
Ano |
Ano |
|
Ne |
Ano |
Ano |
|
Částečné |
Ano |
Ano |
|
Ano |
Ano |
Ano |
|
Ne |
Ne |
Ne |
[přejít na začátek]
Tabulka základních funkcí jazyka C++11: Souběžnost
Základní funkce jazyka C++11: Souběžnost |
Visual Studio 2010 |
Visual Studio 2012 |
Visual Studio 2013 |
---|---|---|---|
Není k dispozici |
Není k dispozici |
Není k dispozici |
|
Ne |
Ano |
Ano |
|
Ne |
Ano |
Ano |
|
Ne |
Ano |
Ano |
|
Není k dispozici |
Není k dispozici |
Není k dispozici |
|
Ne |
Ano |
Ano |
|
Ne |
Ne |
Ne |
|
Ano |
Ano |
Ano |
|
Ne |
Ne |
Ne |
|
Ne |
Ne |
Ne |
|
Částečné |
Částečné |
Částečné |
|
Ne |
Ne |
Ne |
[přejít na začátek]
Základní funkce jazyka C++11: C99
Základní funkce jazyka C++11: C99 |
Visual Studio 2010 |
Visual Studio 2012 |
Visual Studio 2013 |
---|---|---|---|
Částečné |
Částečné |
Částečné |
|
Částečné |
Částečné |
Částečné |
|
Ano |
Ano |
Ano |
|
Není k dispozici |
Není k dispozici |
Není k dispozici |
[přejít na začátek]
Průvodce tabulkami funkcí
Odkazy Rvalue
[!POZNÁMKA]
Označení verze (v0.1, verze 1.0, verze 2.0, 2.1, verze 3.0) v následujících popisů jsou již dříve vynalezli pouze k ukázat vývoj C ++ 11.V samotném standardu se nepoužívají.
N1610 "Vyjasnění inicializaci třídy objektů podle rvalues" byl učiněn pokus early Chcete-li povolit přesunutí sémantiky bez odkazy rvalue.Pro účely této diskuse ho budeme nazývat „odkazy Rvalue v0.1“.Bylo nahrazeno "odkazy rvalue v1.0." "Odkazy Rvalue verze 2.0", který je co práci v jazyce Visual C++ v sadě Visual Studio 2010 byl na základě, zakazuje odkazy rvalue z vazby na lvalues a tím odstraňuje problém s hlavní bezpečnosti. "Odkazy rvalue verze 2.1"také upravuje toto pravidlo.Zvažte vector<string>::push_back(), který má přetížení push_back(const string&) a push_back(string&&) a volá v.push_back("strval").Výraz "strval" je textový literál a má hodnotu lvalue.(Další literály – například na celé číslo. 1729 – rvalues, ale řetězcových jsou zvláštní, protože jsou pole.) Uvedená pravidla "rvalue odkazuje v2.0", který string&& nemůže vytvořit vazbu "strval" protože "strval" je lvalue a proto, push_back(const string&) je pouze životaschopné přetížení.To by vytvořilo dočasný std::string, zkopírovalo jej do vektoru a pak zničilo dočasný std::string, který nebyl příliš efektivní.Pravidla „odkazů rvalue verze 2.1“ poznají, že vazba string&& k "strval" by vytvořila dočasný řetězec std::string, a že dočasný je rvalue.Proto jsou push_back(const string&) i push_back(string&&) životaschopné a push_back(string&&) je upřednostňována.Dočasný objekt std::string je vytvořen a poté přesunut do vektoru.To je efektivnější.
"Odkazy Rvalue verze 3.0" přidá nová pravidla umožňuje automaticky generovat přesunout konstruktory a přesunout operátory přiřazení za určitých podmínek.Nicméně toto není implementováno v Visual C++ v sadě Visual Studio 2013 z důvodu omezení času a prostředků.
[přejít na začátek]
Výrazy lambda
Po lambda funkce byla označena do papíru práce (verze "0,9") a bylo přidáno měnitelný lambda výrazy (verze "1.0"), výbor normalizaci přepracována znění.Výsledkem lambda výrazy verze "1.1", která je nyní plně podporována.Syntaxe výrazů lambda v1.1 vysvětluje, co se má stát v krajních případech, jako např. když existuje odkaz na statické členy nebo vnořené výrazy lambda.To řeší chyby, které jsou aktivovány složitými výrazy lambda.Kromě toho lze nyní převádět výrazy lambda beze stavu na ukazatele funkcí.Tato možnost není obsažena ve znění dokumentu N2927, ale přesto se počítá jako součást výrazů lambda v1.1.C ++ 115.1.2 [expr.prim.lambda]/6 má tento popis: "typ ukončení pro lambda-expression bez lambda-capture má veřejné nevirtuální explicitní konstantní převod funkce, která se ukazatel na funkce, které mají stejné typy parametrů a přejít zpět jako operátor volání funkce typ ukončení.Hodnota vrácená touto funkcí převodu musí být adresa funkce, že po vyvolání má stejné effect jako volání operátor volání funkce typ ukončení. " ( Visual C++ v sadě Visual Studio 2012 Implementace je i větší, než je, vzhledem k tomu, že ji zašle stateless lambda výrazy převést ukazatelů funkcí, které mají libovolného volání konvencí.To je důležité při použití rozhraní API, které očekávají věci jako ukazatele funkcí __stdcall.)
[přejít na začátek]
decltype
Poté, co byla označena decltype do papíru práce (verze 1.0), obdržela malý, ale důležité oprava na poslední chvíli (verze 1.1).Je to zásadní informace pro programátory, kteří pracují s metodami STL a Boost.
[přejít na začátek]
Výčty se silnými typy/dopředně deklarované výčty
Silného typu výčty byly částečně podporovány v jazyce Visual C++ v sadě Visual Studio 2010 (konkrétně část o explicitně určené základní typy).Tyto jsou nyní plně implementovány v sadě Visual Studio a C ++ 11 Sémantika pro dopředu deklarován výčty jsou také plně implementována.
[přejít na začátek]
Zarovnání
Klíčová slova jazyka jádro alignas/alignof z Zarovnání návrh byla označena do práce papíru nejsou implementována.Jazyk Visual C++ v sadě Visual Studio 2010 měl aligned_storage z TR1.Visual C++ v sadě Visual Studio 2012 Přidat aligned_union a std::align() standardní knihovny a významný problémy byly vyřešeny v Visual C++ v sadě Visual Studio 2013.
[přejít na začátek]
Typy standardního rozložení a triviální typy
Zveřejněné změny od N2342 "POD uživatele kdykoli znovu spustit; Řešení problému 568 Core (revize 5) " jsou dodatky z is_trivial a is_standard_layout standardní knihovny šablony <type_traits>.(N2342 přepracována velké množství jádro znění, ale nebyly vyžadovány žádné změny kompilátoru.) Tyto typové vlastnosti nebyly k dispozici v jazyce Visual C++ v sadě Visual Studio 2010, ale jen duplicitní is_pod.Proto tabulka dříve v tomto dokumentu uváděla, že nejsou podporovány.Nyní využívají háčky kompilátoru, které jsou navrženy tak, aby dávaly přesné odpovědi.
STL common_type <> přijatých oprava velmi potřebný v Visual C++ v sadě Visual Studio 2013.Specifikace C ++ 11 pro common_type<> měly neočekávané a nežádoucí důsledky; zejména to, že common_type<int, int>::type vrací int&&.Proto Visual C++ v sadě Visual Studio 2013 implementuje navrhovaný řešení problému knihovny pracovní skupina 2141, což usnadňuje common_type<int, int>::type vrátit int.
Vedlejším účinkem této změny je, případ identity již není funkční (common_type<T> vždy nevytvoří typ T).To odpovídá navrženému řešení, ale dojde k porušení jakéhokoli kódu, který spoléhal na předchozí chování.
Pokud požadujete vlastnost typu identita, nepoužívejte nestandardní std::identity definované v <type_traits>, vzhledem k tomu, že nebude fungovat pro <void>.Místo toho implementujte vlastní typovou vlastnost identity tak, aby vyhovovala vašim potřebám.Tady je příklad:
template <typename T> struct Identity {
typedef T type;
};
[!POZNÁMKA]
Ostatní nejnovějších změn naleznete v části Nejnovější změny ve Visual C++.
[přejít na začátek]
Funkce výchozí a odstraněných
Ty jsou nyní podporovány, ale s touto výjimkou: Pro výchozí funkce není použití =default k požadování konstruktorů s přesouváním a operátory přiřazení přesunutí podporováno.Zkopírované a přesunuté položky nespolupracují přesně jak standardy nařizují – například odstranění přesunutých položek potlačí také kopie, ale Visual C++ v sadě Visual Studio 2013 ne.
Informace o tom, jak používat použita jako výchozí a odstraněna funkcí, naleznete v tématu Definice funkcí jazyka C++.
[přejít na začátek]
přetížit a dokončit
Tato funkce prošla krátkým, ale komplikovaným vývojem.Původně v verze 0,8, nebyly [[override]], [[hiding]], a [[base_check]] atributy.Poté v verze 0,9, atributy byly odstraněny a nahrazeny kontextových klíčových slov.Na závěr v verze 1.0, by byly zmenšeny na "final" v třídách, a "override"a"final" u funkce.Díky tomu je rozšíření Ascended vzhledem k tomu, že to Visual C++ v sadě Visual Studio 2010 již podporován "override" informace o syntaxi funkce, a bylo sémantiku důvodně blízké hodnotám v C ++ 11. "final"byl také podporován, ale v rámci různých pravopisu"Uzavřeno".Standardní pravopis a sémantika „override“ a „final“ jsou nyní plně podporovány.Další informace naleznete v tématu override – specifikátor a final – specifikátor.
[přejít na začátek]
Funkce atomic a další
Atomics, silné porovnat a exchange, obousměrný ochranné, a řazení dat závislostí zadejte standardní knihovny stroje, které jsou nyní implementováno.
Související STL záhlaví:< atomické >, < chrono >, < condition_variable >, < budoucí >, < objekt mutex >, < poměr >, < scoped_allocator >, a < vlákno >.
[přejít na začátek]
C99 __func__ a Preprocessor pravidla
Tabulka tabulka funkce základní jazyk: C99 zobrazí "Částečné" implementaci pro dvě položky.Předdefinované identifikátoru __func__, "Částečné" je uvedena vzhledem k tomu, že je poskytována podpora nestandardní rozšíření __FUNCDNAME__, __FUNCSIG__, a __FUNCTION__.Další informace naleznete v tématu Předdefinovaná makra.Pro pravidla preprocessor C99, "Částečné" je uvedena vzhledem k tomu, variadic makra jsou podporovány.Další informace naleznete v tématu Variadická makra.
[přejít na začátek]
Funkce standardní knihovny
Tato část se týká základního jazyka.Co se týče standardní knihovny C ++11, nemáme přehlednou srovnávací tabulku funkcí, ale jazyk Visual C++ v sadě Visual Studio 2012 je implementuje, a to se dvěma výjimkami.Nejprve, když funkce knihovny závisela na funkci, která chyběla v kompilátoru, byla buď simulovaná – například simulované variadické šablony pro make_shared<T>(), nebo nebyla implementována.(Nebyly pouze několik případů – zejména <initializer_list>– což jsou nyní plně implementovány v Visual C++ v sadě Visual Studio 2013.) Velmi několik výjimek, bylo uskutečněno C99 v Visual C++ v sadě Visual Studio 2013 a C++ obálku hlavičky zprostředkované.Další informace naleznete v tématu C99 podpora knihovny v sadě Visual Studio 2013.
Zde je částečný seznam změn v Visual C++ v sadě Visual Studio 2012 a Visual C++ v sadě Visual Studio 2013:
Uložení: Jak je požadováno v C ++ 11, emplace()/emplace_front()/emplace_back()/emplace_hint()/emplace_after() jsou implementovány ve všech kontejnerech pro „libovolné“ počty argumentů (viz oddíl „simulovaná proměnná arita“).Například vector<T> má "template <typename... Args> void emplace_back(Args&&... args)", což přímo vytvoří element typu T na zádi vektoru z libovolného počtu libovolných argumentů dokonale předaných dál.To může být efektivnější než push_back(T&&), což by vyžadovalo další přesun konstrukce a zničení.
Variadics: Visual C++ v sadě Visual Studio 2012 obsahovalo schéma pro simulaci variadic šablony.V Visual C++ v sadě Visual Studio 2013, simulace chybějí a plně implementují variadics.Pokud váš kód závisí na původním chování simulovaných variadických šablon, je třeba ho opravit.Má však přepnout do skutečně variadických šablon lepší čas kompilace a snižuje spotřebu paměti kompilátoru.
Explicitní převod operátorů: V základním jazyce jsou operátory explicitního převodu obecné funkce – například můžete mít explicit operator MyClass().Nicméně standardní knihovna aktuálně používá pouze jeden formulář: explicit operator bool(), který určuje, že třídy jsou bezpečně logicky testovatelné.(Prostý "operator bool()" je často nebezpečné.) Dříve, Visual C++ simulované explicit operator bool() s operator pointer-to-member(), která vedla k různých bolesti hlavy a lehké nedostatky.Nyní bylo toto řešení s „falešnou logickou hodnotou“ zcela odebráno.
**Náhodnost:**uniform_int_distribution je nyní dokonale neposunutého a shuffle() je implementována ve <algorithm>, který přijme přímo jednotné generátory náhodných číslo, jako jsou mersenne_twister.
Odolnost vůči přetížení operátorů adresy: Jazyk C++ 98/03 prvku kontejneru STL zakázal přetěžování operátora adresy.Toto provádějí třídy, jako je CComPtr tak, aby pomocné třídy jako CAdapt musely zaštítit STL před takovými přetíženími.Během vývoje jazyka Visual C++ v sadě Visual Studio 2010 způsobovaly změny v STL odmítání přetížených operátorů address-of v ještě větším počtu situací.Jazyk C++11 změnil požadavky tak, aby byly přetížené operátory address-of přijatelné.Jazyky C++11 a Visual C++ ve verzi Visual Studio 2010 poskytují pomocnou funkci std::addressof(), která může získat skutečnou adresu objektu bez ohledu na přetížení operátoru.Před vydáním Visual C++ v sadě Visual Studio 2010, jsme se pokusili nahradit výskyty "&elem"s"std::addressof(elem)", což je vhodně odolná.Visual C++ v sadě Visual Studio 2012 došlo k dalšímu, tak, aby třídy, které přetížení metody jejich adresa pro operátor by měla být použitelná v celém STL.
Visual C++ v sadě Visual Studio 2012 přesahoval C++ 11 několika způsoby:
STRACH iterátory: povolených ne však standardem C ++ 11, STRACH iterátory byla provedena, jak je popsáno ve N2911 "Minimalizací závislosti v rámci obecný třídy pro rychlejší a menší programy" a N2980 "STRACH iterační přiřazení a inicializační, revize 1".
Systému souborů:<filesystem> záhlaví z Návrh TR2 byla přidána.Nabízí recursive_directory_iterator a další zajímavé funkce.Předtím, než práce na TR2 byl zablokovat, protože C ++ 0 x byl spuštěn velmi opožděně a byla změna na C ++ 11, návrh 2006 byl odvozen od Boost.Filesystem V2.Později se rozvinul na Boost.Filesystem V3, který ale není implementován v aplikaci Visual C++ v sadě Visual Studio 2012.
A došlo k výrazné optimalizaci.Všechny naše kontejnery jsou nyní s ohledem na jejich aktuální reprezentace optimálně malé.To platí pro objekty kontejnerů jako takové, nikoli pro obsah, na který odkazují.Například std::vector obsahuje tři nezpracované ukazatele.V aplikaci Visual C++ v sadě Visual Studio 2010 ve verzi x86 bylo std::vector 16 bajtů.V Visual C++ v sadě Visual Studio 2012 je to 12 bajtů, což je optimálně malé.Je to důležitá záležitost – pokud máte 100 000 vektorů ve svém programu, Visual C++ v sadě Visual Studio 2012 vám ušetří 400 000 bajtů.Nižší využití paměti pak šetří prostor i čas.
Bylo toho dosaženo vyloučením skladování prázdných alokátorů a komparátorů, protože std::allocator a std::less jsou bezstavové.(Tyto optimalizace jsou možné také u vlastních alokátorů/komparátorů, pokud jsou beze stavu.Samozřejmě nelze zabránit ukládání stavových alokátorů/komparátorů, ale k tomu dochází jen velmi zřídka.)
Visual C++ v sadě Visual Studio 2013 ještě více přesahuje C ++ 11 k implementaci některých klíčových funkcí C ++ 14 knihovny:
"Transparentní funktory operátorů" less<>, greater<>, plus<>, multiplies<>, a tak dále.
make_unique<T>(args...) a make_unique<T[]>(n)
Nečlenské funkce cbegin()/cend(), rbegin()/rend() a crbegin()/crend().
[přejít na začátek]
Viz také
Referenční dokumentace
Příkaz For založený na rozsahu (C++)
Koncepty
Novinky v jazyce Visual C++ v sadě Visual Studio 2013
Nejnovější změny ve Visual C++
Další zdroje
C++ vás vítá zpět (moderní verze jazyka C++)
Referenční dokumentace jazyka C++