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
Visual Studio 2010 |
Visual Studio 2012 |
Visual Studio 2013 |
|
---|---|---|---|
v2.0 |
v2.1* |
v2.1* |
|
Hayır |
Hayır |
Hayır |
|
Hayır |
Hayır |
||
Hayır |
Hayır |
||
Hayır |
Hayır |
||
Evet |
Evet |
Evet |
|
v1.0 |
v1.0 |
v1.0 |
|
Evet |
Evet |
Evet |
|
v1.0 |
v1.1 |
v1.1 |
|
v1.0 |
v1.1** |
v1.1 |
|
Evet |
Evet |
Evet |
|
Hayır |
Hayır |
Evet |
|
Hayır |
Hayır |
Hayır |
|
Hayır |
Hayır |
||
Evet |
Evet |
Evet |
|
Evet |
Evet |
Evet |
|
Kısmi |
Evet |
Evet |
|
Hayır |
Evet |
Evet |
|
Hayır |
Hayır |
Hayır |
|
Hayır |
Hayır |
Hayır |
|
TR1 |
Kısmi |
Kısmi |
|
Hayır |
Hayır |
||
Hayır |
Hayır |
Hayır |
|
Hayır |
Hayır |
Evet |
|
Hayır |
Hayır |
Hayır |
|
Hayır |
Hayır |
Hayır |
|
Hayır |
Hayır |
||
Hayır |
Hayır |
Hayır |
|
Hayır |
Hayır |
Hayır |
|
Hayır |
Evet |
Evet |
|
Hayır |
Hayır |
||
Evet |
Evet |
Evet |
|
Hayır |
Hayır |
Hayır |
|
Hayır |
Hayır |
Hayır |
|
Hayır |
Hayır |
Hayır |
|
Yerel ve adlandırılmamış türleri şablon bağımsız değişken olarak |
Evet |
Evet |
Evet |
Hayır |
Evet |
Evet |
|
Kısmi |
Evet |
Evet |
|
Evet |
Evet |
Evet |
|
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 |
---|---|---|---|
N/A |
N/A |
N/A |
|
Hayır |
Evet |
Evet |
|
Hayır |
Evet |
Evet |
|
Hayır |
Evet |
Evet |
|
N/A |
N/A |
N/A |
|
Hayır |
Evet |
Evet |
|
Hayır |
Hayır |
Hayır |
|
Evet |
Evet |
Evet |
|
Hayır |
Hayır |
Hayır |
|
Hayır |
Hayır |
Hayır |
|
Kısmi |
Kısmi |
Kısmi |
|
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 |
---|---|---|---|
Kısmi |
Kısmi |
Kısmi |
|
Kısmi |
Kısmi |
Kısmi |
|
Evet |
Evet |
Evet |
|
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
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