Sdílet prostřednictvím


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

C ++ 11 základní funkce jazyka

Visual Studio 2010

Visual Studio 2012

Visual Studio 2013

Odkazy rvalue v0.1, v1.0, verze 2.0, verze 2.1, verze 3.0

v2.0

v2.1*

v2.1*

ref kvalifikátory

Ne

Ne

Ne

Nestatické datového člena inicializátory

Ne

Ne

Ano

Šablony Variadic v0.9, v1.0

Ne

Ne

Ano

Zobrazí inicializátoru

Ne

Ne

Ano

static_assert

Ano

Ano

Ano

automaticky v0.9, v1.0

v1.0

v1.0

v1.0

Trailing návratové typy

Ano

Ano

Ano

Lambda výrazy v0.9, v1.0, v1.1

v1.0

v1.1

v1.1

decltype v1.0, v1.1

v1.0

v1.1**

v1.1

Pravým lomené závorky

Ano

Ano

Ano

Výchozí šablona argumenty pro funkci šablony

Ne

Ne

Ano

Výraz SFINAE

Ne

Ne

Ne

Alias šablony

Ne

Ne

Ano

Externí šablony

Ano

Ano

Ano

nullptr

Ano

Ano

Ano

Silného typu výčty

Částečné

Ano

Ano

Dopředu deklarován výčty

Ne

Ano

Ano

Atributy

Ne

Ne

Ne

constexpr

Ne

Ne

Ne

Zarovnání

TR1

Částečné

Částečné

Delegování konstruktory

Ne

Ne

Ano

Dědění konstruktory

Ne

Ne

Ne

Operátory explicitní převodu

Ne

Ne

Ano

char16_t/char32_t

Ne

Ne

Ne

Unicode řetězcových

Ne

Ne

Ne

Literály Nezpracovaný řetězec

Ne

Ne

Ano

Názvy universal znak v literály

Ne

Ne

Ne

Uživatelem definované literály

Ne

Ne

Ne

Standardní rozložení a trivial typy

Ne

Ano

Ano

Defaulted a odstraněných funkce

Ne

Ne

Ano*

Extended přítele prohlášení

Ano

Ano

Ano

Extended sizeof

Ne

Ne

Ne

Obory názvů vloženého

Ne

Ne

Ne

Neomezený sjednocení

Ne

Ne

Ne

Místní a nepojmenované typy jako argumenty šablony

Ano

Ano

Ano

Na základě rozsahu pro smyček

Ne

Ano

Ano

přepsání a finální v0.8, v0.9, v1.0

Částečné

Ano

Ano

Minimální GC podpory

Ano

Ano

Ano

noexcept

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

Mění body sekvence

Není k dispozici

Není k dispozici

Není k dispozici

Atomics

Ne

Ano

Ano

Silné porovnat a exchange

Ne

Ano

Ano

Obousměrný ochranné

Ne

Ano

Ano

Paměťový model

Není k dispozici

Není k dispozici

Není k dispozici

Řazení dat závislostí

Ne

Ano

Ano

Řazení dat závislosti: funkce anotace

Ne

Ne

Ne

exception_ptr

Ano

Ano

Ano

quick_exit

Ne

Ne

Ne

Atomics v obslužné rutině signál

Ne

Ne

Ne

Vlákna místní úložiště

Částečné

Částečné

Částečné

Kouzelná zaznamenávány

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

__func__

Částečné

Částečné

Částečné

C99 preprocessor

Částečné

Částečné

Částečné

dlouho dlouhé

Ano

Ano

Ano

Rozšířené typy celé číslo

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

Výrazy lambda v jazyce C++

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++

Standardní knihovna C++ – referenční dokumentace

Blog týmu Visual C++