Udostępnij za pośrednictwem


Obsługa dla funkcji C++11 (Modern C++)

W tym artykule opisano funkcji C ++ 11 w Visual C++.

W tym artykule

  • Lista funkcji 11 c ++

    • Tabeli funkcji języka Core

    • Podstawowe tabeli funkcji języka: współbieżności

    • Podstawowe tabeli funkcji języka: C99

  • Przewodnik po funkcji tabel

    • Odwołuje się do Rvalue

    • Lambdas

    • decltype

    • Zdecydowanie wyliczenia zadeklarowany Typed/do przodu

    • Wyrównanie

    • Standardowy układ i Trivial typy

    • Domyślne i usunięte funkcje

    • zastąpienie i final

    • Atomics i inne

    • C99 __func__ i preprocessor reguły

  • Standardowe funkcje biblioteki

Lista funkcji C++11

Program Visual C++ w Visual Studio 2010 zaimplementowana wiele funkcji w C ++ 11 podstawowe specyfikacji języka, i Visual C++ w programie Visual Studio 2012 dodać jednej z nich.Visual C++ w programie Visual Studio 2013 Rozszerza ten pokrycie dodatkowo i obsługuje także niektóre 14 C ++ funkcje biblioteki.W poniższej tabeli zestawiono podstawowe funkcje języka C ++ 11 i ich stan wdrożenia w języku Visual C++ in programie Visual Studio 2010, Visual C++ w programie Visual Studio 2012 i w Visual C++ w programie Visual Studio 2013.

Tabela podstawowych funkcji języka C++11

C ++ 11 podstawowe funkcje języka

Visual Studio 2010

Visual Studio 2012

Visual Studio 2013

Odwołuje się do Rvalue v0.1, v1.0, w wersji 2.0, wersja 2.1, w wersji 3.0

v2.0

v2.1*

v2.1*

kwalifikatorów ref

Nie

Nie

Nie

Inicjatory elementu członkowskiego danych Niestatyczne

Nie

Nie

Tak

Szablony Variadic v0.9, v1.0

Nie

Nie

Tak

Wyświetla inicjatora

Nie

Nie

Tak

static_assert

Tak

Tak

Tak

automatycznie v0.9, v1.0

v1.0

v1.0

v1.0

Czołowej zwracanych typów

Tak

Tak

Tak

Lambdas v0.9, v1.0, v1.1

v1.0

v1.1

v1.1

decltype v1.0, v1.1

v1.0

v1.1**

v1.1

Prawym przyciskiem nawiasu ostrego

Tak

Tak

Tak

Domyślny szablon argumentów dla funkcji szablonów

Nie

Nie

Tak

Wyrażenie SFINAE

Nie

Nie

Nie

Alias szablony

Nie

Nie

Tak

Szablony zewnętrzny

Tak

Tak

Tak

nullptr

Tak

Tak

Tak

Jednoznacznie określony typ wyliczenia

Częściowe

Tak

Tak

Do przodu zadeklarowany wyliczenia

Nie

Tak

Tak

Atrybuty

Nie

Nie

Nie

constexpr

Nie

Nie

Nie

Wyrównanie

TR1

Częściowe

Częściowe

Delegowanie konstruktorów

Nie

Nie

Tak

Dziedziczenie konstruktorów

Nie

Nie

Nie

Operatory konwersji jawnej

Nie

Nie

Tak

char16_t/char32_t

Nie

Nie

Nie

Literały Unicode

Nie

Nie

Nie

Literały nieprzetworzony ciąg

Nie

Nie

Tak

Uniwersalnym znak nazwy w literały

Nie

Nie

Nie

Użytkownika literały

Nie

Nie

Nie

Standardowy układ i typy trivial

Nie

Tak

Tak

Usunięte funkcje i Defaulted

Nie

Nie

Tak*

Rozszerzony deklaracje znajomego

Tak

Tak

Tak

Rozszerzony elemencie sizeof

Nie

Nie

Nie

Obszary nazw tekście

Nie

Nie

Nie

Bez ograniczeń związków

Nie

Nie

Nie

Lokalnego i nienazwanych typy argumentów szablonu

Tak

Tak

Tak

Na podstawie zakresu pętli for

Nie

Tak

Tak

zastąpienie i final v0.8, v0.9, v1.0

Częściowe

Tak

Tak

Pomocy technicznej GC minimalne

Tak

Tak

Tak

noexcept

Nie

Nie

Nie

[przejdź do góry]

Tabela podstawowych funkcji języka C++11: Współbieżność

Podstawowe funkcje języka C++11: Współbieżność

Visual Studio 2010

Visual Studio 2012

Visual Studio 2013

Przeredagowane punktów sekwencji

Nie dot.

Nie dot.

Nie dot.

Atomics

Nie

Tak

Tak

Porównaj silne i exchange

Nie

Tak

Tak

Ogrodzenia dwukierunkowego

Nie

Tak

Tak

Modelu pamięci

Nie dot.

Nie dot.

Nie dot.

Porządkowania danych zależności

Nie

Tak

Tak

Porządkowania danych zależności: funkcja adnotacji

Nie

Nie

Nie

exception_ptr

Tak

Tak

Tak

quick_exit

Nie

Nie

Nie

Atomics w obsługi sygnał

Nie

Nie

Nie

Magazyn lokalny wątku

Częściowe

Częściowe

Częściowe

Magiczna statyczne

Nie

Nie

Nie

[przejdź do góry]

Podstawowe funkcje języka C++11: C99

Podstawowe funkcje języka C++11: C99

Visual Studio 2010

Visual Studio 2012

Visual Studio 2013

__func__

Częściowe

Częściowe

Częściowe

Preprocesora C99

Częściowe

Częściowe

Częściowe

długi czas

Tak

Tak

Tak

Rozszerzonych typów całkowitą

Nie dot.

Nie dot.

Nie dot.

[przejdź do góry]

Przewodnik po tabelach funkcji

Referencje rvalue

[!UWAGA]

Oznaczenia wersji (v0.1, v1.0, wersja 2.0, wersja 2.1, wersja 3.0) w poniższych opisów są wynaleźli tak, aby wyświetlić rozwój C ++ 11.Sama norma z nich nie korzysta.

N1610 "Wyjaśnienia inicjowania obiektów klasy przez rvalues" wczesnym próbę przenoszenia semantyki bez rvalue odwołuje się do włączenia.Na potrzeby tych rozważań nazwiemy to „odwołania rvalue v0.1”.Został zastąpiony przez "odwołuje się do rvalue v1.0." "Odwołuje się do Rvalue w wersji 2.0", którego ma pracy w programie Visual C++ w Visual Studio 2010 oparto na, zabrania odwołania rvalue z wiązania do lvalues, a tym samym rozwiązanie problemu głównych bezpieczeństwa. "Odwołuje się do Rvalue wersja 2.1"usprawnia tej reguły.Należy rozważyć vector<string>::push_back(), który ma przeciążenia push_back(const string&) i push_back(string&&), a wywołanie v.push_back("strval").Wyrażenie "strval" jest ciągiem literału i wartością.(Inne literały — na przykład liczba całkowita 1729 — są rvalues, ale literały są specjalne, ponieważ są one tablic.) Zasady "rvalue odwołuje się do v2.0" mówiąc, który string&& nie można powiązać z "strval" ponieważ "strval" jest lvalue, a dzięki temu push_back(const string&) jest jedynym możliwym przeciążenia.Utworzyłoby to tymczasowy std::string, skopiowało to do wektora, a następnie zniszczyło tymczasowo std::string, co nie jest zbyt wydajne.Zasady "odwołań r-wartości v2.1" rozpoznają to powiązanie string&& z "strval", co spowodowałoby utworzenie tymczasowego std::string i tymczasowej r-wartości.Dlatego obie push_back(const string&) i push_back(string&&) są możliwe i push_back(string&&) jest preferowana.Tymczasowe std::string jest wykonane, a następnie przenoszone do wektora.Jest to bardziej wydajne.

"Odwołuje się do Rvalue w wersji 3.0" dodaje nowe reguły w celu automatycznego generowania konstruktorów przenoszenia i Przenieś operatory przypisania zgodnie z warunkami.Jednak to nie jest zaimplementowane w Visual C++ w programie Visual Studio 2013 ze względu na ograniczenia czasu i zasobów.

[przejdź do góry]

Wyrażenia Lambda

Po Funkcje lambda zostały odrzucone na dokument pracy (wersji "0,9") i dodano modyfikowalną lambdas (wersji "1.0"), Komitet Normalizacji po przeglądzie treść.To utworzone lambdas wersji "1.1", który jest teraz w pełni obsługiwana.Sformułowanie wyrażeń lambda v1.1 wyjaśnia, co powinno nastąpić w przypadkach brzegowych, jak odwołanie do statycznych elementów członkowskich czy lambd zagnieżdżonych.To naprawia problemy, które są spowodowane przez złożone lambdy.Dodatkowo bezstanowe lambdy są teraz konwertowane do wskaźników funkcji.Nie jest to zawarte w sformułowaniach N2927, jednak mimo to jest zaliczane jako część lambd v1.1.C ++ 115.1.2 [expr.prim.lambda]/6 ma ten opis: "Typ zamknięcia dla lambda-expression bez lambda-capture ma publicznych-wirtualnej bez jawnego stała konwersji funkcja wskaźnik do funkcji ma ten sam typ parametru i zwrotu jako operator wywołania funkcji Typ zamknięcia.Wartość zwrócona przez tę funkcję konwersji jest adres funkcji, że po wywołaniu, ma tej samej effect jako wywoływanie operator wywołania funkcji Typ zamknięcia. " ( Visual C++ w programie Visual Studio 2012 Implementacja jest jeszcze lepsze niż, przekłada bezstanowej lambdas można przekonwertować typ do wskaźników funkcji, których dowolnego konwencji wywoływania.Jest to istotne, kiedy używasz API, które wymagają elementów takich jak wskaźniki funkcji __stdcall.)

[przejdź do góry]

decltype

Po decltype zostało odrzucone do papieru pracy (w wersji 1.0), otrzymał mały, ale ważne poprawki w ostatniej minucie (w wersji 1.1).Jest to bardzo istotne dla programistów pracujących na STL i Boost.

[przejdź do góry]

Wyliczenia o jednoznacznie określonym typie/zadeklarowane zapowiadająco

Jednoznacznie określony typ wyliczenia częściowo były obsługiwane w programie Visual C++ w Visual Studio 2010 (w szczególności część o jawnie określonych typów podstawowych).Teraz są one w pełni zaimplementowana w programie Visual Studio i C ++ 11 semantyka dla do przodu zadeklarowany wyliczenia są również w pełni zaimplementowana.

[przejdź do góry]

Wyrównanie

Słowa kluczowe języka podstawowego alignas/alignof z propozycję wyrównanie który został Głosowany do pracy dokument nie jest zaimplementowana.Visual C++ w Visual Studio 2010 miał aligned_storage z TR1.Visual C++ w programie Visual Studio 2012 dodaje aligned_union i std::align() w bibliotece standardowych i znacznie problemy zostały rozwiązane w Visual C++ w programie Visual Studio 2013.

[przejdź do góry]

Typy standardowego układu i proste

Zmiany udostępnionego przez N2342 "POD jego uruchomić ponownie; Rozpoznawania 568 problem Core (wersja 5) " to dodatki z is_trivial i is_standard_layout do standardowych biblioteki szablonów <type_traits>.(N2342 ponownie obrobione wiele wpisów języka podstawowego, ale kompilator żadne zmiany nie były wymagane). Te cechy typu były dostępne w programie Visual C++ w Visual Studio 2010, ale ich zduplikowanych is_pod.Tym samym, tabela zamieszczona wcześniej w tym dokumencie informowała o braku obsługi.Są one teraz obsługiwane przez haki kompilatora, które mają na celu udzielić dokładnych odpowiedzi.

STL common_type <> otrzymane poprawka bardzo potrzebnego w Visual C++ w programie Visual Studio 2013.Specyfikacja C ++ 11 dla common_type<> miała niepożądane i nieoczekiwane konsekwencje; to sprawia, że common_type<int, int>::type zwraca int&&.Dlatego Visual C++ w programie Visual Studio 2013 implementuje proponowane rozwiązania problemu grupy roboczej Biblioteka 2141, który sprawia, że common_type<int, int>::type zwrócić int.

Jako efekt uboczny tej zmiany przestaje działać w przypadku tożsamości (common_type<T> nie zawsze skutkuje dla typu T).Jest to zgodne z Proponowanym rozwiązaniem, ale unieważnia jakikolwiek kod, który opierał się na poprzednim zachowaniu.

Jeśli wymagasz cechy typu tożsamości, nie należy używać niestandardowego typu std::identity zdefiniowanego w obiekcie <type_traits>, ponieważ nie będzie działać dla obiektu <void>.Zamiast tego wdróż własną cechę typu tożsamości odpowiednią do własnych potrzeb.Oto przykład:

template <typename T> struct Identity {
    typedef T type;
};

[!UWAGA]

W przypadku innych zmian podziału, zobacz Fundamentalne zmiany w Visual C++.

[przejdź do góry]

Domyślnym oraz usunięte funkcje

Są teraz obsługiwane, ale z tym wyjątkiem: w przypadku funkcji domyślnych, użycie =default do żądania konstruktorów przenoszących member-wise i operatorów przypisania przenoszenia nie jest obsługiwane.Kopie i przeniesienie nie wchodzą w interakcję dokładnie tak, jak według Standardu powinny — na przykład, usunięcie przeniesień ma również tłumić kopie, ale Visual C++ w programie Visual Studio 2013 tego nie robi.

Aby uzyskać informacje dotyczące sposobu używania konfigurowanych domyślnie i usunięte funkcje, Definicje funkcji języka C++.

[przejdź do góry]

zastąpienie i zakończenie

Przeszło to krótką, ale skomplikowaną ewolucję.Pierwotnie w wersji 0,8, wystąpiły [[override]], [[hiding]], i [[base_check]] atrybutów.Następnie w wersji 0,9, atrybuty zostały usunięte i zastąpione kontekstowe słów kluczowych.Ponadto w w wersji 1.0, zostały one zmniejszone do "final" w klasach, i "override"i"final" w funkcji.Dzięki temu rozszerzenie osiągnie, ponieważ Visual C++ w Visual Studio 2010 już obsługiwany to "override" składni w funkcji, i mieli semantyki przypuszczać, że te w C ++ 11 blisko. "final"także obsługiwane, ale pod inną pisownię"zapieczętowanych".Standardowa pisownia i semantyka „override” i „final” są teraz w pełni obsługiwane.Aby uzyskać więcej informacji, zobacz override, specyfikator i final, specyfikator.

[przejdź do góry]

Operacje atomowe i więcej

Atomics, Porównaj silne i exchange, ogrodzenia dwukierunkowego, i porządkowania danych zależności Określ maszyny standardowe biblioteki, które są teraz stosowane.

Nagłówki STL pokrewne:< częściowych >, < chrono >, < condition_variable >, < przyszłych >, < mutex >, < stosunek >, < scoped_allocator >, i < wątku >.

[przejdź do góry]

C99 __func__ i Preprocessor reguły

Tabela tabeli funkcji języka podstawowych: C99 Wyświetla "Częściowe" wykonania na dwa elementy.Wstępnie zdefiniowane identyfikatora __func__, "Częściowe" jest wyświetlane, ponieważ obsługiwane niestandardowe rozszerzenia __FUNCDNAME__, __FUNCSIG__, i __FUNCTION__.Aby uzyskać więcej informacji, zobacz Wstępnie zdefiniowane makra.W przypadku reguł preprocessor C99 "Częściowe" jest wyświetlane, ponieważ makra variadic są obsługiwane.Aby uzyskać więcej informacji, zobacz Makra wariadyczne.

[przejdź do góry]

Funkcje biblioteki standardowej

Obejmuje język podstawowy.Jeśli chodzi o bibliotekę standardową C++11, nie mamy ładnej tabeli porównawczej, ale program Visual C++ w programie Visual Studio 2012 wdrożył ją, z dwoma wyjątkami.Po pierwsze gdy funkcja biblioteki zależała od funkcji, której brakowało w kompilatorze, to była albo symulowana — na przykład symulowane zmienne szablony dla funkcji make_shared<T>() — lub nie została zaimplementowana.(Wystąpiły tylko kilka przypadków — głównie, <initializer_list>— które teraz są w pełni stosowane w Visual C++ w programie Visual Studio 2013.) Bardzo mało wyjątków C99 została zaimplementowana w Visual C++ w programie Visual Studio 2013 i C++ otokę nagłówki udostępnione.Aby uzyskać więcej informacji, zobacz C99 biblioteki obsługi w programie Visual Studio 2013.

Oto częściowa lista zmian w Visual C++ w programie Visual Studio 2012 i Visual C++ w programie Visual Studio 2013:

Umieszczanie: zgodnie z wymaganiami C ++ 11, emplace()/emplace_front()/emplace_back()/emplace_hint()/emplace_after() są implementowane w wszystkie pojemnikach dla "dowolnej" liczby argumentów (patrz "Simulated variadics" sekcja).Na przykład, vector<T> ma "template <typename... Args> void emplace_back(Args&&... args)" który bezpośrednio konstrukcje elementu typu T z tyłu wektor z dowolnej liczby argumentów dowolnego, doskonale przekazane.Może to być bardziej efektywne niż push_back(T&&), która obejmowałaby budowy dodatkowy ruch i zniszczenia.

Variadics: Visual C++ w programie Visual Studio 2012 mieli schemat symulowanie variadic szablonów.W Visual C++ w programie Visual Studio 2013, zniknęły symulacje i variadics są w pełni wdrożone.Jeśli kod opiera się na zachowaniu starych symulowanych szablonów wariadycznych, musisz to naprawić.Jednak przełączenie na rzeczywiście zmienne szablony ulepszyło czasy kompilacji i zmniejszyło zużycie pamięci kompilatora.

Operatory konwersji jawnej: W języku podstawowym operatory konwersji jawnej są ogólną funkcją — na przykład można mieć explicit operator MyClass().Jednakże standardowa biblioteka aktualnie używa tylko jednego formularza: explicit operator bool(), co sprawia, że klasy są bezpiecznie weryfikowalne na zgodność z formatem wartości logicznych.(Zwykły "operator bool()" jest bardzo niebezpieczne.) Wcześniej, Visual C++ symulowanych explicit operator bool() z operator pointer-to-member(), które doprowadziło do różnych problemów i niewielkie nieefektywność.Teraz to obejście z „fałszywą wartością logiczną” jest całkowicie usunięte.

**Losowości:**uniform_int_distribution jest teraz idealnie nieobciążonej, a shuffle() jest zaimplementowana w <algorithm>, który akceptuje bezpośrednio jednolite generatorów liczby losowe, takich jak mersenne_twister.

Odporność na przeciążony adres operatorów: C ++ 98/03 zabrania przeciążania adresu operatora elementem kontenera STL.Tak robią klasy takie jak CComPtr, aby pomocnicze klasy takie jak CAdapt musiały chronić STL przed takimi przeciążeniami.Podczas programowania w Visual C++ w Visual Studio 2010, zmiany STL powodowały odrzucenie przeciążonego adresu operatorów w większości sytuacji.C++11 zmienił wymagania, aby przeciążone adresy operatorów były do przyjęcia.C++11 i Visual C++ w Visual Studio 2010, zapewnia funkcja pomocnika std::addressof(), który może uzyskać prawdziwy adres obiektu, niezależnie od przeciążenia operatora.Przed Visual C++ w Visual Studio 2010 został wydany, próby zastąpić wystąpienia "&elem"z"std::addressof(elem)", który jest odpowiednio na.Visual C++ w programie Visual Studio 2012 Ponadto poszło tak, aby klasy, które przeładowania ich adres z operatorem powinien być używany przez cały STL.

Visual C++ w programie Visual Studio 2012 wykracza poza C++11 na kilka sposobów:

PRZERAŻENIE Iteratory: jako dozwolone, ale nie jest wymagane przez C ++ 11 Standard, Iteratory PRZERAŻENIE zaimplementowaniu w sposób opisany w N2911 "Minimalizując zależności w ramach ogólnego klasy dla szybciej i mniejsze programy" i N2980 "PRZERAŻENIE przypisania sterująca i inicjowania, wersja 1".

Systemu plików:<filesystem> Nagłówek z propozycję TR2 został dodany.Oferuje recursive_directory_iterator i inne interesujące funkcje.Przed pracę nad TR2 został zablokować, ponieważ C ++ 0 x była uruchomiona w bardzo opóźnione i został zmienić C ++ 11, propozycję 2006 został utworzony na podstawie Boost.Filesystem V2.Później przekształciła się w Boost.Filesystem V3, ale nie jest zaimplementowana w Visual C++ w programie Visual Studio 2012.

I główna optymalizacja!Wszystkie nasze kontenery są teraz optymalnie małe, biorąc pod uwagę ich bieżące reprezentacje.Odnosi się to do obiektów kontenera, a nie do ich wskazanej zawartości.Na przykład std::vector zawiera trzy pierwotne wskaźniki.W języku Visual C++ w programie Visual Studio 2010 tryb wydania x86, std::vector, był 16-bajtowy.W Visual C++ w programie Visual Studio 2012, to 12 bajtów, co jest optymalnie małe.Jest to ważne wydarzenie — jeżeli posiadasz 100 000 wektorów w swoim programie, Visual C++ w programie Visual Studio 2012 zapisuje 400 000 bitów.Zmniejszone użycie pamięci oszczędza miejsce i czas.

Osiągnięto to unikając przechowywania pustych alokatorów i komparatorów, ponieważ std::allocator i std::less nie posiadają stanu.(Optymalizacje te są włączone również dla niestandardowych alokatorów/komparatorów, o ile są one bezstanowe.Oczywiście nie można uniknąć przechowywania alokatorów/komparatorów ze stanem, ale te występują bardzo rzadko).

Visual C++ w programie Visual Studio 2013 dodatkowo rozszerza możliwości poza C ++ 11 do zaimplementowania główne funkcje biblioteki 14 C ++:

  • "Przezroczyste funktory operatora" less<>, greater<>, plus<>, multiplies<>, i tak dalej.

  • make_unique<T>(args...) i make_unique<T[]>(n)

  • cbegin()/cend(), rbegin()/rend(), i crbegin()/crend() funkcje nieczłonkowskie.

[przejdź do góry]

Zobacz też

Informacje

Wyrażenia lambda w języku C++

Range-based for — instrukcja (C++)

Koncepcje

Co nowego w Visual C++ dla Visual Studio 2013

Fundamentalne zmiany w Visual C++

Inne zasoby

Zapraszamy ponownie do języka C++ (Modern C++)

Materiały referencyjne dotyczące języka C++

Odwołanie do standardowej biblioteki C++

programu Visual C++ Team Blog