FDISには、付録C.2
「C ++およびISO C ++ 2003」に非互換性に関するセクションがあります。
まとめ、FDISをここで言い換えると、SOの回答として(より良い)FDISが適切になるようにします。違いを説明するために、自分の例をいくつか追加しました。
ライブラリーに関連した非互換性がいくつかあり、その意味が正確にわからないため、他の人に詳しく説明するために残しておきます。
コア言語
#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 .
新しいキーワード:alignas、alignof、char16_t、char32_t、constexpr、decltype、noexcept、nullptr、static_assert、およびthread_local
longで表すことができるよりも大きい特定の整数リテラルは、符号なし整数型から符号付きlong longに変更される可能性があります。
整数除算を使用する有効なC ++ 2003コードは、結果を0または負の無限大に向かって丸めますが、C ++ 0xは常に結果を0に丸めます。
(確かに、ほとんどの人にとって互換性の問題は実際にはありません)。
キーワードauto
をストレージクラス指定子として使用する有効なC ++ 2003コードは、C ++ 0xでは無効になる場合があります。
変換を狭めると、C ++ 03との非互換性が発生します。たとえば、次のコードはC ++ 2003では有効ですが、この国際標準では無効です。doubleからintへの変換は狭まるためです。
int x[] = { 2.0 };
暗黙的に宣言された特別なメンバー関数は、暗黙的な定義が不適切な形式である場合に削除されたと定義されます。
これらの特別なメンバー関数のいずれかを、定義が不要なコンテキスト(たとえば、潜在的に評価されない式)で使用する有効なC ++ 2003プログラムは、不正な形式になります。
私の例:
struct A { private: A(); };
struct B : A { };
int main() { sizeof B(); /* valid in C++03, invalid in C++0x */ }
そのようなsizeofトリックは一部のSFINAEで使用されており、今すぐ変更する必要があります:)
ユーザー宣言のデストラクタには、暗黙の例外指定があります。
私の例:
struct A {
~A() { throw "foo"; }
};
int main() { try { A a; } catch(...) { } }
このコードはterminate
C ++ 0xでは呼び出されますが、C ++ 03では呼び出されません。A::~A
C ++ 0x の暗黙の例外指定はだからですnoexcept(true)
。
を含む有効なC ++ 2003宣言export
は、C ++ 0xでは形式が正しくありません。
>
直後に別の>
が続く有効なC ++ 2003式は、2つのテンプレートを閉じるものとして扱われる場合があります。
C ++ 03では、>>
常にシフト演算子トークンになります。
内部リンケージのある関数の従属呼び出しを許可します。
私の例:
static void f(int) { }
void f(long) { }
template<typename T>
void g(T t) { f(t); }
int main() { g(0); }
C ++ 03ではこれを呼び出しますf(long)
が、C ++ 0xではこれを呼び出しますf(int)
。C ++ 03とC ++ 0xの両方で、次の呼び出しが行われることに注意してくださいf(B)
(インスタンス化のコンテキストでは、externリンケージ宣言のみが考慮されます)。
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)
外部リンクがないため、より適切なマッチングは行われません。
ライブラリの変更
C ++ 0xのC ++標準ライブラリに追加された識別子を使用する有効なC ++ 2003コードは、コンパイルに失敗したり、この国際標準で異なる結果を生成したりする場合があります。
#includes
新しいC ++ 0x標準ライブラリヘッダーの名前のヘッダーが有効なC ++ 2003コードは、この国際標準では無効である可能性があります。
スワップが存在することを期待してコンパイルされた有効なC ++ 2003コードには<algorithm>
、代わりに<utility>
グローバル名前空間posix
は標準化のために予約されています。
有効なC ++定義があること2003コードoverride
、final
、carries_dependency
、またはnoreturn
マクロなどのC ++ 0xのでは無効です。
export
キーワードの意味を削除しますか?コートをもらおう。