C++11 Özellikleri Desteği (Modern C++)

Bu makalede, C ++ 11 özelliklerini Visual C++'ta açıklar.

Bu Makalede

  • C ++ 11 özellik listesi

    • Çekirdek dil özellik tablosu

    • Çekirdek dil özellik tablosu: eşzamanlılık

    • Çekirdek dil özellik tablosu: C99

  • Tablolar özellik Kılavuzu

    • Rvalue başvuruları

    • Lambda

    • decltype

    • Türü kesin yazılı/İleri bildirilmiş numaralandırmaları

    • Hizalama

    • Standart düzeni ve önemsiz türleri

    • Varsayılan haline getirilen ve silinen işlevler

    • geçersiz kılma ve son

    • Atomics ve daha fazlası

    • C99 __func__ ve ön işlemci kuralları

  • Standart kitaplığı özellikleri

C ++ +11 özellik listesi

Visual Studio 2010 Visual C++ uygulanan pek çok özellik C ++ 11 çekirdek dil belirtimi, ve Visual Studio 2012'te Visual C++ daha fazlası eklendi.Visual Studio 2013'te Visual C++ Bu kapsamı daha genişletir ve ayrıca bazı C ++ 14 desteklediği kitaplığı özellikleri.Aşağıdaki tablo, C++11 çekirdek dil özelliklerini ve onların Visual C++ in Visual Studio 2010, Visual Studio 2012'te Visual C++, ve Visual Studio 2013'te Visual C++ öğesi içindeki uygulama durumlarını listeler.

C++11 Çekirdek Dil Özellikleri Tablosu

c ++ 11 çekirdek dil özellikleri

Visual Studio 2010

Visual Studio 2012

Visual Studio 2013

Rvalue başvuruları v0.1, sürüm 1.0, v2.0, v2.1, v3.0

v2.0

v2.1*

v2.1*

ref niteleyicileri

Hayır

Hayır

Hayır

Statik olmayan veri üye başlatıcılar

Hayır

Hayır

Evet

Variadic şablonları v0.9, sürüm 1.0

Hayır

Hayır

Evet

Başlatıcısı listeler

Hayır

Hayır

Evet

static_assert

Evet

Evet

Evet

Otomatik v0.9, sürüm 1.0

v1.0

v1.0

v1.0

Sağ dönüş türü

Evet

Evet

Evet

Lambda v0.9, sürüm 1.0, v1.1

v1.0

v1.1

v1.1

decltype sürüm 1.0, v1.1

v1.0

v1.1**

v1.1

Sağ açılı ayraçları

Evet

Evet

Evet

Varsayılan şablon değişkenlerini işlevi şablonlar için

Hayır

Hayır

Evet

İfadesi SFINAE

Hayır

Hayır

Hayır

Diğer şablonları

Hayır

Hayır

Evet

Dış şablonları

Evet

Evet

Evet

nullptr

Evet

Evet

Evet

Numaralandırmaları'kesin türü belirtilmiş

Kısmi

Evet

Evet

İleri numaralandırmaları bildirilmiş

Hayır

Evet

Evet

Öznitelikleri

Hayır

Hayır

Hayır

constexpr

Hayır

Hayır

Hayır

Hizalama

TR1

Kısmi

Kısmi

Oluşturucuları için temsilci seçme

Hayır

Hayır

Evet

Oluşturucular devraldığı

Hayır

Hayır

Hayır

Açık dönüştürme işleçleri

Hayır

Hayır

Evet

char16_t/char32_t

Hayır

Hayır

Hayır

Unicode dize hazır

Hayır

Hayır

Hayır

Ham dize hazır

Hayır

Hayır

Evet

Değişmez değerler evrensel karakter adları

Hayır

Hayır

Hayır

Kullanıcı tanımlı değişmez değerler

Hayır

Hayır

Hayır

Standart düzeni ve önemsiz türleri

Hayır

Evet

Evet

Defaulted ve silinmiş işlevleri

Hayır

Hayır

Evet*

Arkadaş bildirimleri Genişletilmiş

Evet

Evet

Evet

Sizeof Genişletilmiş

Hayır

Hayır

Hayır

Satır içi ad alanları

Hayır

Hayır

Hayır

Sınırsız birleşimler

Hayır

Hayır

Hayır

Yerel ve adlandırılmamış türleri şablon bağımsız değişken olarak

Evet

Evet

Evet

Aralığına dayalı için-döngü

Hayır

Evet

Evet

geçersiz kılma ve son v0.8, v0.9, sürüm 1.0

Kısmi

Evet

Evet

En az GC Destek

Evet

Evet

Evet

noexcept

Hayır

Hayır

Hayır

[yukarı git:]

C++11 Çekirdek Dil Özellikleri Tablosu: Eşzamanlılık

C++11 Çekirdek Dil Özellikleri: Eşzamanlılık

Visual Studio 2010

Visual Studio 2012

Visual Studio 2013

Reworded sırası noktaları

N/A

N/A

N/A

Atomics

Hayır

Evet

Evet

Güçlü Karşılaştır ve exchange

Hayır

Evet

Evet

Çift yönlü dilimleri

Hayır

Evet

Evet

Bellek model

N/A

N/A

N/A

Veri bağımlılık sıralama

Hayır

Evet

Evet

Veri bağımlılık sıralama: işlev ek açıklama

Hayır

Hayır

Hayır

exception_ptr

Evet

Evet

Evet

quick_exit

Hayır

Hayır

Hayır

Sinyal işleyicileri Atomics

Hayır

Hayır

Hayır

İş parçacığı yerel depolama

Kısmi

Kısmi

Kısmi

Sihirli başınadır

Hayır

Hayır

Hayır

[yukarı git:]

C++11 Çekirdek Dil Özellikleri: C99

C++11 Çekirdek Dil Özellikleri: C99

Visual Studio 2010

Visual Studio 2012

Visual Studio 2013

__func__

Kısmi

Kısmi

Kısmi

C99 preprocessor

Kısmi

Kısmi

Kısmi

uzun uzun

Evet

Evet

Evet

Tamsayı türleri Genişletilmiş

N/A

N/A

N/A

[yukarı git:]

Özellik Tabloları İçin Kılavuz

Rvalue Başvuruları

[!NOT]

Yalnızca C ++ 11 evrimi göstermek için aşağıdaki açıklamalarında sürümü belirlemeleri (v0.1, sürüm 1.0, v2.0, v2.1, v3.0) geliştirmiştir.Standardın kendisi bunları kullanmaz.

N1610 "Açıklama başlatma rvalues sınıf nesnelerin" erken taşıma semantiği rvalue başvurusu olmayan etkinleştirme denemesi idi.Bu tartışma için "rvalue başvuruları v0.1" olarak adlandıralım.".Tarafından değiştirildi "rvalue başvuruları sürüm 1.0." "Rvalue başvuruları v2.0", ne iş'in Visual C++ Visual Studio 2010'bağlı, lvalues bağlama öğesinden rvalue başvurular engeller ve dolayısıyla bir ana güvenlik sorunu giderir. "Rvalue başvuruları v2.1"Bu kural iyileştirir.Aşırı vector<string>::push_back() ve push_back(const string&) kodlarına sahip olan push_back(string&&) kodunu ve v.push_back("strval") çağırmasını deneyin."strval" ifadesi bir dize sabitidir ve bir lvalue'dur.(Diğer değişmez değerler — Örneğin, tamsayı 1729 — rvalues, ancak dize hazır özel dizileri olduklarından.) "Rvalue v2.0 başvurular" kuralları, söylediğiniz string&& bağlanılamıyor "strval" olduğundan "strval" bir lvalue olduğunu ve bu nedenle, push_back(const string&) yalnızca uygun aşırı yüklemesi.Bu geçici bir std::string oluşturacak, vektöre kopyalayacak ve ardından geçici, çok da verimli olmayan std::string öğesini yok edecek."rvalue başvuruları v2.1" string&& ile "strval" bağlamanın geçici bir std::string oluşturacağını ve geçicinin bir rvalue olduğunu tanımlar.Bu nedenle, push_back(const string&) ve push_back(string&&) kurtarılabilir ve push_back(string&&) tercih edilir.Geçici std::string oluşturulur ve ardından vektöre taşınır.Bu daha verimlidir.

"Rvalue başvuruları v3.0" otomatik olarak taşıma oluşturucular oluşturmak ve bazı koşullar altında atama işleçleri taşımak için yeni kurallar ekler.Ancak bu işlem zaman ve kaynak kısıtlamaları nedeniyle Visual Studio 2013'te Visual C++ için uygulanmaz.

[yukarı git:]

Lambda ifadeleri

Sonra lambda işlevleri çalışma belgesine oy (sürümü "0.9") ve değişebilir lambda eklendi (sürümü "1.0"), standartlaştırma komite ifade overhauled.Bu üretilen lambda "1.1 sürümünün", hangi artık tam olarak desteklenir.Lambdalar v1.1 ifadesi statik üyelere veya iç içe geçmiş lambdalara başvuru gibi köşe durumlarda ne yapılacağını açıklar.Bu, karmaşık lambda tarafından tetiklenen sorunları düzeltir.Ek olarak durum bilgisiz lambdalar artık işlev işaretçilerine dönüştürebilir.Bu N2927 ifadelerini kullanmaz ancak lambda v1.1 parçası olarak kabul edilir.c ++ 115.1.2 [expr.prim.lambda]/6 bu açıklama sahip: "Kapatma türü için bir lambda-expression olmayan lambda-capture bir ortak sanal olmayan açık olmayan const dönüştürme işlevi için Kapatma türü işlev çağrısı işleci aynı parametre ve dönüş türlerine sahip işlev işaretçisi vardır.Bu dönüştürme işlevi tarafından döndürülen değer, bir işlevin adresini tutulamaz çağrıldığında, Kapatma türü işlev çağrısı işleci çağırma olarak aynı effect olduğunu,. " ( Visual Studio 2012'te Visual C++ Uygulamasıdır daha daha iyi olduğundan durum bilgisi olmayan lambda rastgele çağırma kurallarını sahip işlev işaretçileri dönüştürülebilir kolaylaştırır.Bu, __stdcall işlev işaretçileri gibi şeyler bekleyen API'lar kullandığınızda önemlidir.)

[yukarı git:]

decltype

Decltype çalışma belgesine oy verdi sonra (sürüm 1.0), en son dakikada bir küçük ancak önemli düzeltme alınan (sürüm 1.1).Bu, STL ve Boost üzerinde çalışan programlar için oldukça ilgi çekicidir.

[yukarı git:]

Kesin Tür Belirtilmiş/İleri Bildirimli numaralandırmalar

Numaralandırmaları'kesin türü belirtilmiş Visual Studio 2010 (özellikle, açıkça belirtilen temel türleri hakkında bölüm) Visual C++'ta kısmen desteklenen.Bunları şimdi tam olarak Visual Studio ve C ++ 11 için semantiği uygulanır İleri numaralandırmaları bildirilmiş de tam olarak uygulanır.

[yukarı git:]

Hizalama

Çekirdek dil anahtar alignas/alignof öğesinden Hizalama teklif çalışma belgesine oy değil uygulanır.Visual C++ Visual Studio 2010'da TR1'danaligned_storage vardır.Visual Studio 2012'te Visual C++ eklenen aligned_union ve std::align() Standart Kitaplığı ve önemli giderilen Visual Studio 2013'te Visual C++.

[yukarı git:]

Standart Düzen ve Basit Türler

Gösterilen değişikliklerden N2342 "POD (yeniden); Çekirdek sorunu 568 (düzeltme 5) çözme " ekleri olan is_trivial ve is_standard_layout standart şablon kitaplık için <type_traits>.(Çok sayıda çekirdek dil ifade N2342 yeniden, ancak derleyici değişiklik gerekli.) Bu tür benzer özelliklere sahip Visual Studio 2010 Visual C++'ta kullanılabilen, ancak yalnızca yinelenen is_pod.Bu nedenle bu belgenin önceki bölümlerinde yer alan tabloda destek "Hayır" olarak belirtilmiştir.Artık içinde, doğru yanıtlar vermek üzere tasarlanmış derleyici kancaları tarafından destekleniyorlar.

STL'in common_type <> gerekli düzeltme alınan Visual Studio 2013'te Visual C++.common_type<> için C++11 belirtimi beklenmedik ve istenmeyen sonuçlara, özellikle de common_type<int, int>::type öğesinin int&& döndürmesine neden olmuştur.Bu nedenle, Visual Studio 2013'te Visual C++ uygulayan kitaplık çalışma grubu sorun 2141 için önerilen çözüm, hangi yapar common_type<int, int>::type dönüş int.

Bu değişikliğin yan etkisi olarak kimlik durumu artık çalışmaz (common_type<T> her zaman T türünde sonuç vermez).Bu Önerilen Çözünürlük ile uyumludur, ancak önceki çalışma biçimine dayalı kodları keser.

Bir kimlik türü niteliğine gereksinim duyarsanız, standart dışı std::identity kullanmayın, bu <type_traits> içinde tanımlandığından, <void> için çalışmaz.Bunun yerine, gereksinimlerinize uyan kendi kimlik türü ayırt edici niteliğini uygulayın.Örnek buradadır:

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

[!NOT]

Diğer yeni değişiklikler için bkz: Visual C++'taki Yeni Değişiklikler.

[yukarı git:]

Varsayılan ve silinmiş işlevleri

Bunlar artık desteklenir, ancak tek özel durum şudur: Varsayılan olarak ayarlanan işlevler söz konusu olduğunda, üye algılayan taşıma oluşturucuları ve taşıma atama işleçleri istemek için =default kullanılmaz.Kopyalar ve taşıma işlemleri tam olarak Standard'ın belirttiği gibi etkileşimde bulunmaz; örneğin, taşımaların silinmesi kopyaların da önleneceğini belirtir, ancak Visual Studio 2013'te Visual C++ yapmaz.

Varsayılan ve işlevleri silinmiş nasıl kullanılacağı hakkında bilgi için bkz C++ İşlev Tanımları.

[yukarı git:]

override ve final

Bu kısa ama karmaşık bir değişim sürecinden geçti.İlk olarak, içinde sürümü 0.8, vardı [[override]], [[hiding]], ve [[base_check]] öznitelikleri.Sonra sürümü 0.9, öznitelikleri ortadan ve bağlamsal anahtar sözcükleri ile değiştirilir.Son olarak, içinde sürüm 1.0, sınırlı "final" sınıfları, ve "override"ve"final" işlevleri üzerinde.Visual Studio 2010 Visual C++ zaten bu desteklemediği için bu Ascended uzantı kolaylaştırır "override" sözdizimi, İşlevler, ve bunları C ++ 11 yakın makul semantiği kaldı. "final"Ayrıca desteklenen, ancak farklı yazım altında"korumalı"."override" ve "final" öğelerinin Standart standart yazımı ve anlamı artık tümüyle destekleniyor.Daha fazla bilgi için override Tanımlayıcısı ve final Tanımlayıcısı.

[yukarı git:]

Atomikler ve Daha Fazlası

Atomics, güçlü Karşılaştır ve exchange, çift yönlü dilimleri, ve veri bağımlılık sıralama şimdi uygulanır standart kitaplığı makine belirtin.

İlgili STL üstbilgileri:< atomik >, < chrono >, < condition_variable >, < gelecekteki >, < mutex >, < oranı >, < scoped_allocator >, ve < iş parçacığı >.

[yukarı git:]

C99 __func__ ve ön işlemci kuralları

Tablo Çekirdek dil özellik tablosu: C99 iki öğe için "Kısmi" uygulaması listeler.Önceden tanımlanmış tanımlayıcı için __func__, "Kısmi" listeleniyor destek standart uzantılarını sağlandığından __FUNCDNAME__, __FUNCSIG__, ve __FUNCTION__.Daha fazla bilgi için Önceden Tanımlı Makrolar.C99 ön işlemci kuralları için "Kısmi" için listelenen variadic makro desteklenir.Daha fazla bilgi için Variadic Makrolar.

[yukarı git:]

Standart Kitaplık Özellikleri

Bu, çekirdek dili kapsar.C++11 Standart Kitaplığı için mükemmel bir karşılaştırma özellik tablosu sunamıyoruz, ancak Visual Studio 2012'te Visual C++, iki özel durum ile birlikte, bu uygulamayı gerçekleştirmektedir.Önce, bir kitaplık özelliği, derleyicide eksik olan bir işleve bağımlı olduğunda benzetilir — örneğin, benzetilmiş değişken şablonlar için make_shared<T>()— ya da uygulanmaz.(Yalnızca birkaç çalışmaları vardı — özellikle, <initializer_list>—, artık tam olarak uygulanır içinde Visual Studio 2013'te Visual C++.) Çok az sayıda durumlarla C99 içinde uygulanan Visual Studio 2013'te Visual C++ ve sağlanan C++ sarmalayıcı üstbilgileri.Daha fazla bilgi için C99 kitaplık desteği Visual Studio 2013'teki.

Visual Studio 2012'te Visual C++ ve Visual Studio 2013'te Visual C++ öğelerinin içindeki değişikliklerin kısmi bir listesi:

Yerleştirme: C++11'in gerektirdiği düzeyde emplace()/emplace_front()/emplace_back()/emplace_hint()/emplace_after() tüm kapsayıcılarda "rastgele" sayıda bağımsız değişkenler için uygulanır. (Benzetilen bağımsız değişken içeren bölümüne gözatın.)Örneğin, vector<T>; mükemmel bir şekilde iletilen, rastgele bağımsız değişkenler arasından rastgele bir sayıdan, bir vektörün arkasına doğrudan T türünde bir öğe oluşturan "template <typename... Args> void emplace_back(Args&&... args)", öğesine sahiptir.Bu, ek taşıma oluşturma ve yok etme içeren push_back(T&&) öğesinden daha verimli olabilir.

Variadics: Visual Studio 2012'te Visual C++ variadic şablonları taklit bir şema vardı.İçindeki Visual Studio 2013'te Visual C++, benzetimleri geride kaldı ve variadics tam olarak uygulanan.Kodunuz eski benzetilen variadics davranışına dayanıyorsa, bu sorunu gidermelisiniz.Ancak gerçek variadic şablonlara değişim derleme sürelerini iyileştirir ve derleyicinin bellek tüketimini azaltır.

Açık dönüştürme işleçleri: Çekirdek Dil içinde açık dönüştürme işleçleri genel bir özelliktir; örneğin explicit operator MyClass() öğesine sahip olabilirsiniz.Ancak, Standart Kitaplık şu anda yalnızca bir form kullanır: explicit operator bool(), bu sınıfları güvenle Boolean test edilebilir hale getirir.(Düz "operator bool()" notoriously tehlikelidir.) Benzetimli daha önce Visual C++ explicit operator bool() birlikte operator pointer-to-member(), çeşitli sürekli ve küçük verimsiz neden.Şimdi, bu "sahte bool" geçici çözümü tümüyle kaldırılmıştır.

**Rastgele:**uniform_int_distribution olan şimdi mükemmel taraflı olmayan, ve shuffle() uygulanır <algorithm>, hangi doğrudan kabul eder Tekdüzen rastgele sayı oluşturucuları ister mersenne_twister.

Aşırı yüklenen address-of işleçlerinin direnci: C++98/03, STL kapsayıcı öğesinin address-of işleçlerinin aşırı yüklenmesini yasaklar.Bu, CComPtr gibi sınıfların yaptığı işlemdir, CAdapt gibi yardımcı sınıfların STL'yi bu aşırı yüklerden korumaları gerekir.Visual C++ in Visual Studio 2010 geliştirmesi sırasında, STL değişiklikleri çok daha fazla durumda işleçlere ilişkin aşırı yüklenmiş adreslerin reddedilmesine neden oldu.C++11, aşırı yüklenmiş address-off işleçlerini kabul edilebilir kılmak üzere gereksinimleri değiştirdi.C++11 ve Visual C++ in Visual Studio 2010, işlecin aşırı yüklenmesinden bağımsız olarak bir nesnenin doğru adresini alabilen yardımcı işlevini std::addressof() sağlar.Visual C++ Visual Studio 2010'da yayımlanan önce örnekleri değiştirmek isteğinizi çalıştığımız "&elem"ile"std::addressof(elem)", uygun şekilde dayanıklı olduğu.Visual Studio 2012'te Visual C++ Ayrıca, böylece kendi adresi, İşleç aşırı yüklemesi sınıfları STL kullanılabilir geçti.

Visual Studio 2012'te Visual C++ pek çok yönüyle C++11'in ilerisine gitmiştir.

KORKUTUCU Yineleyicilerde: izin verilen olarak C ++ 11 standart gerektirdiği ancak, KORKUTUCU yineleyiciler, tarafından açıklanan uygulanmış olan N2911 "En aza bağımlılıkları içindeki genel sınıflar için daha hızlı ve daha küçük program" ve N2980 "KORKUTUCU yineleyici atama ve başlatma, düzeltme 1".

Dosya sistemi:<filesystem> başlığından TR2 teklif eklendi.recursive_directory_iterator ve diğer ilginç özellikleri sunar.2006 teklif türetilen C ++ 0 x çok geç çalıştıran ve C ++ 11'e değiştirme idi olduğundan TR2 çalışmaları dondurulmuş önce Boost.Filesystem V2.Daha sonra Boost.Filesystem V3 haline gelmiştir ancak Visual Studio 2012'te Visual C++ içinde uygulanmamıştır.

Ve önemli bir iyileştirme!Mevcut temsilleri göz önüne alındığında, şimdi tüm kapsayıcılarımız daha uygun olacak şekilde küçüktür.Bu, kapsayıcı nesnelerinin kendisine başvurur, işaretlenen içeriklerine değil.Örneğin, std::vector üç ham işaretçi içerir.Visual Studio 2010 x86 sürümü modundaki Visual C++'da, std::vector 16 bayttı.Visual Studio 2012'te Visual C++ içinde bu değer daha az bir şekilde 12 bayttır.Bu önemlidir, programınızda 100.000 vektör varsa, Visual Studio 2012'te Visual C++ size 400.000 bayt kazandırır.Düşük bellek kullanımı hem alan ve zaman tasarrufu sağlar.

Bu, std::allocator ve std::less durum bilgisiz olduğundan boş ayırıcıların ve karşılaştırıcıların depolanmasını atlayarak gerçekleştirildi.(Bu iyileştirmeler, durum bilgisiz olduğu sürece özel ayırıcılar/karşılaştırıcılar için de etkinleştirilir.Kuşkusuz, durum bilgisi olan ayırıcıların/karşılaştırıcıların depolanması önlenemez ancak bu durumla çok nadir olarak karşılaşılır)

Visual Studio 2013'te Visual C++ daha bazı anahtar C ++ 14 kitaplığı özellikleri uygulamak için C ++ 11 gider:

  • "Saydam işleç işlev nesneleri" less<>, greater<>, plus<>, multiplies<> vb.

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

  • cbegin()/cend(), rbegin()/rend() ve crbegin()/crend() üye harici işlevleri.

[yukarı git:]

Ayrıca bkz.

Başvuru

C++'deki Lambda İfadeleri

Range-based for Deyimi (C++)

Kavramlar

Visual Studio 2013'deki Visual C++ Yenilikleri

Visual C++'taki Yeni Değişiklikler

Diğer Kaynaklar

C++'a (Modern C++) Tekrar Hoş Geldiniz

C++ Dili Başvurusu

C++ Standart Kitaplığı Başvurusu

Visual C++ ekip blog'u