FDIS'in C.2
"C ++ ve ISO C ++ 2003" ekinde uyumsuzluklar için bir bölüm vardır .
Özet, burada FDIS'i açıklayarak, daha iyi bir SO yanıtı olarak uygun hale getirmek için. Farklılıkları göstermek için kendi örneklerimi ekledim.
Etkilerini tam olarak bilmediğim birkaç kütüphane ile ilgili uyumsuzluk var, bu yüzden bunları başkalarının üzerinde durması için bırakıyorum.
Çekirdek dil
#define u8 "abc"
const char *s = u8"def"; // Previously "abcdef", now "def"
#define _x "there"
"hello"_x // now a user-defined-string-literal. Previously, expanded _x .
Yeni anahtar kelimeler: alignas, alignof, char16_t, char32_t, constexpr, decltype, noexcept, nullptr, static_assert ve thread_local
Uzun ile temsil edilebilenden daha büyük belirli tamsayı değişmezleri, işaretsiz bir tamsayı türünden uzun süre imzalı olarak değişebilir.
Tamsayı bölme kullanan geçerli C ++ 2003 kodu sonucu 0'a veya negatif sonsuza doğru yuvarlar, oysa C ++ 0x her zaman sonucu 0'a yuvarlar.
(kuşkusuz çoğu insan için bir uyumluluk sorunu değildir).
Anahtar kelimeyi auto
depolama sınıfı belirleyicisi olarak kullanan geçerli C ++ 2003 kodu C ++ 0x'de geçersiz olabilir.
Dönüşümleri daraltmak, C ++ 03 ile uyumsuzluklara neden olur. Örneğin, aşağıdaki kod C ++ 2003'te geçerlidir ancak bu Uluslararası Standartta geçersizdir, çünkü çiftten int'e daralma dönüşümüdür:
int x[] = { 2.0 };
Örtük olarak bildirilen özel üye işlevleri, örtük tanım kötü biçimlendirildiğinde silinmiş olarak tanımlanır.
Bu özel üye işlevlerinden birini, tanımın gerekli olmadığı bir bağlamda (örneğin, potansiyel olarak değerlendirilmeyen bir açıklamada) kullanan geçerli bir C ++ 2003 programı, kötü biçimlendirilir.
Bana örnek:
struct A { private: A(); };
struct B : A { };
int main() { sizeof B(); /* valid in C++03, invalid in C++0x */ }
Bu tür hileler bazı SFINAE tarafından kullanıldı ve şimdi değiştirilmesi gerekiyor :)
Kullanıcı tarafından bildirilen yıkıcılar gizli bir istisna özelliğine sahiptir.
Bana örnek:
struct A {
~A() { throw "foo"; }
};
int main() { try { A a; } catch(...) { } }
Bu kod terminate
C ++ 0x ile çağırır , ancak C ++ 03 ile çağırmaz. Çünkü A::~A
C ++ 0x içinde örtülü istisna belirtimi noexcept(true)
.
export
C ++ 0x içinde geçerli bir C ++ 2003 bildirimi içeren kötü biçimlendirilmiş.
>
Hemen ardından başka bir harf içeren geçerli bir C ++ 2003 ifadesi, >
iki şablonun kapatılması olarak değerlendirilebilir.
C ++ 03'te >>
her zaman vardiya operatörü belirteci olur.
Dahili bağlantılı işlevlerin bağımlı çağrılarına izin ver.
Bana örnek:
static void f(int) { }
void f(long) { }
template<typename T>
void g(T t) { f(t); }
int main() { g(0); }
C ++ 03'te bu çağırır f(long)
, ancak C ++ 0x'de bu çağırır f(int)
. Hem C ++ 03 hem de C ++ 0x'de aşağıdaki çağrıların f(B)
(örnekleme bağlamının hala yalnızca dış bağlantı bildirimlerini dikkate aldığı) belirtilmesi gerekir.
struct B { };
struct A : B { };
template<typename T>
void g(T t) { f(t); }
static void f(A) { }
void f(B) { }
int main() { A a; g(a); }
f(A)
Dış bağlantıya sahip olmadığı için daha iyi eşleşme alınmaz.
Kütüphane değişiklikleri
C ++ 0x'in C ++ standart kitaplığına eklenen tanımlayıcıları kullanan geçerli C ++ 2003 kodu, Bu Uluslararası Standartta farklı sonuçlar derleyemeyebilir veya üretemeyebilir.
#includes
Yeni C ++ 0x standart kitaplık başlıklarının adlarıyla üstbilgilerin geçerli geçerli C ++ 2003 kodu, bu Uluslararası Standartta geçersiz olabilir.
Takasın gerçekleşmesini beklerken derlenen geçerli C ++ 2003 kodunun <algorithm>
aşağıdakileri içermesi gerekebilir<utility>
Global ad alanı posix
artık standartlaştırma için ayrılmıştır.
Geçerli C ++ tanımlar o 2003 kod override
, final
, carries_dependency
, veya noreturn
makro olarak C ++ 0x ile geçersiz.
export
Anahtar kelimenin anlamı kaldırılsın mı? Bana mont getireyim.