D と C++0x
C++ では現在、新しい規格 -- 通称 C++0x の策定が進められています。 この記事では、 C++0x core language changes の要点を取り上げ、現在 D にある機能と比較します。 C++0x はまだまだ完成には遠いため、 この記事の内容は新しい企画案によって obsolete となる可能性があります。ご了承下さい。 ここでは、C++0x 標準ライブラリの更新点は扱いません。 以下では、TBD は To Be Determined (未定) の略記です。
C++0x に提案されている機能
- C++言語への右辺値参照の追加
- クラスオブジェクトの右辺値参照による初期化の明確化
- Move Semantics を *this へ拡大 (Revision 2)
- static_assert
- C++ におけるテンプレートのalias
- Extern template
- 可変個引数テンプレート
- 可変長テンプレートテンプレート引数の拡張
- nullポインタに名前を: nullptr
- 強い型付けのenum
- friend宣言の拡張
- 一般定数式
- 名前空間の関連づけ ("Strong Using")
- C++ プリプロセッサと C99 の摺り合わせ
- プログラミング言語 C++ への alignment サポートの追加
- 条件的にサポートされる動作
- 未定義動作をエラーに
- C++ への long long 型の追加
- C++ への拡張整数型の追加
- 移譲コンストラクタ
- 明示的変換演算子
- 新しい文字型
- 右 > 括弧
- 初期化式から変数の型を推論
- auto 宣言の構文
- コンストラクタの継承
- 制御完了点の、より粒度の高い代替案
- (単相) λ式とクロージャ
- C99 の __func__ 定義済み識別子の追加
- マルチスレッド環境におけるアトミック操作
- 実行順と並列メモリモデル
- Raw 文字列リテラル
- PODs unstrung
- スレッド待ちで例外を伝播
- Decltype
- sizeof の拡張
- UTF8 リテラル
- リテラル内でのユニバーサル文字名
- デフォルト/削除済み関数
- 制限無し共用体
- マルチスレッドライブラリを標準 C++ に
- プロセスを手放す
- 返値型推論のための新しい関数宣言構文
- シグナルハンドラ内で atomics を使用可能にする
C++言語への右辺値参照の追加
N1770: TBD
クラスオブジェクトの右辺値参照による初期化の明確化
N1610: TBD
Move Semantics を *this へ拡大 (Revision 2)
N2439: TBD
static_assert
N1720: static assert は D に含まれています。
C++ におけるテンプレートの alias
N2258: テンプレートとテンプレートインスタンス のどちらも aliase 可能です:
struct S(T) { T int; } alias S X; // テンプレートの alias alias S!(int) Y; // テンプレートインスタンスの alias X!(int) x; Y y; // x と y は同じ型
Extern template
N1987: これは、旧来の compile/link ビルドモデルに起因する問題の回避策です。 D のコンパイラでは、複数のモジュールを同時にコンパイルした場合は、 テンプレートインスタンスは全体で一つのみ生成します。 各オブジェクトファイルそれぞれに別々でインスタンス化することは避けるようになっています。 さらなる改良として、 複数の冗長なテンプレートインスタンスを生成することのないライブラリを生成する方式が予定されています。
可変個引数テンプレート
N2242: D の 可変個引数テンプレート.
可変長テンプレートテンプレート引数の拡張
N2555: TBD
nullポインタに名前を: nullptr
強い型付けのenum
- 異なるenum型同士の比較はエラーであるべきですが、
そうなっていません:
void main() { enum Color { ClrRed, ClrOrange, ClrYellow, ClrGreen, ClrBlue, ClrViolet }; enum Alert { CndGreen, CndYellow, CndRed }; Color c = Color.ClrRed; Alert a = Alert.CndGreen; a = c; // エラー a = Color.ClrYellow; // エラー bool armWeapons = ( a >= Color.ClrYellow ); // ok; oops }
- ベースとする型は指定できます。
- 名前付きenumは強くスコープが限られています。無名enumメンバは、 周りのスコープで宣言されます。
- 名前付きenumのメンバを参照するには、 明示的な就職が必要です。
friend宣言の拡張
N1791: モジュール内のコードは全て、 同じモジュール内の同一スコープで宣言された クラスや構造体の private メンバに アクセス できます。 パッケージprotectedメンバは、 同じパッケージの全てのコードからアクセスできます。 Dでは、friend 宣言を導入して 複雑な名前検索規則を扱う必要がありません。
一般定数式
N2235: D には コンパイル時間数実行 (CTFE) があります。CTFE は、より柔軟で、 コンパイル時に関数を評価することができます:
- 特別なキーワードは不要 (C++0x では constexpr が必要)
- 関数内で複数の文を実行できます
- 再帰も可能
- ローカル変数の書き換えも使えます
- out引数も使えます
名前空間の関連づけ ("Strong Using")
N2535: D には名前空間はないので、 これは無関係です。
C++ プリプロセッサと C99 の摺り合わせ
N1653: D にはプリプロセッサはないので、 これは無関係です。
プログラミング言語 C++ への alignment サポートの追加
N2341: D では align 属性で宣言のアラインメントを指定することができ、 また .alignof プロパティによって 式や型のアラインメントを得ることができます。
条件的にサポートされる動作
N1627: D では、pragma などでベンダ特有の動作を行うことが許されています。
未定義動作をエラーに
N1727: D では整数リテラル型、 文字エスケープ、... に非POD型を渡す場合に未定義動作はありません。
C++ への long long 型の追加
C++ への拡張整数型の追加
N1988: D では cent と ucent 型が 128 bit 整数型として用意されています (dmdやgdcでは未実装です)。 その他の拡張整数型の提案はありませんが、 言語コアにさらにそれを追加する正当性が 思い浮かびません。
移譲コンストラクタ
明示的変換演算子
N2437: TBD
新しい文字型
N2249: C++0x では新しい文字型 char16_t と char32_t が加わります。 これは D の wchar と dchar 型 に対応します。 リテラルの接頭辞 u と U は、 D の 接尾辞 w と d に対応します。
右 > 括弧
N1757: D ではテンプレートのインスタンス化に < > ではなく !( ) を使うため、 構文解析の曖昧性やそれを修正する必要性はありません。
初期化式から変数の型を推論
auto宣言の構文
N2546: D の auto 宣言 には特に構文的な問題はありません。
コンストラクタの継承
N2540: TBD
制御完了点の、より粒度の高い代替案
N2239: TBD
(単相) λ式とクロージャ
C99 の __func__ 定義済み識別子の追加
N2340: TBD
マルチスレッド環境におけるアトミック操作
N2427: TBD
実行順と並列メモリモデル
N2429: TBD
Raw 文字列リテラル
N2442: D には wysiwyg文字列とデリミタ文字列 があり、 全ての文字列は Unicode です。
PODs unstrung
N2294: D の 構造体 は全て POD (Plain Old Data) で、 D の クラス は全て参照型の多態型です。
スレッド待ちで例外を伝播
N2179: TBD
Decltype
sizeof の拡張
N2253: this オブジェクトなしでの sizeof:
struct S { int a; static int foo() { return a.sizeof; } } void test() { int x = S.a.sizeof; }はDでは正しく動作します。
UTF-8 リテラル
N2442: char型文字列リテラル は UTF-8 形式です。
リテラル内でのユニバーサル文字名
N2170: 文字列リテラル では全てのUnicode文字が使用可能です。 ただし、hexリテラル記法を使わない限り、 サロゲートペアは使用できません。
デフォルト/削除済み関数
N2346: TBD
制限無し共用体
N2544: TBD
マルチスレッドライブラリを標準 C++ に
N2447: TBD
プロセスを手放す
N2440: TBD
返値型推論のための新しい関数宣言構文
N2445: TBD
シグナルハンドラ内で atomics を使用可能にする
N2547: TBD
ローカルクラスをより使いやすく
N2402: D ではローカルクラスをテンプレート引数に使うことに 制限はありません。
初期化子リスト
N2531: D には 構造体リテラル、 配列リテラル、 連想配列リテラル があります。
スレッドローカル記憶領域
N2280: D にはスレッドローカル記憶領域がありますが、まだ設計が確定していません。
メンバ初期化子
N2426: D には デフォルト初期化子 という名前で、 メンバ初期化子 があります。
Concept (統合案)
N2501: TBD
新しいforループの提案
N2394: これは D の ForeachRangeStatement と同等です。
属性の一般化
N2418: ベンダ特有の属性を 文や宣言に設定するには、 pragma を使います。
拡張可能リテラル
N2378: D にはユーザー拡張可能なリテラルはありません
動的初期化と並列性
N2513: TBD
GCと到達可能性に基づくリーク検出の、最小サポート
N2527: C++0x では GC はオプションですが、 D では 必須です。 GCをオプション扱いとすることの問題は、 汎用のライブラリを書こうとすると結局 GC が無い環境を想定する必要があるため、 生産性の向上に何も寄与しないということです。
列挙子の前方宣言
N2499: D では、全ての宣言が実質的に並行して処理されるため、 前方宣言は不要です。 一方で、不完全 enum 型も、記述可能です:
enum E : int;
メンバはユーザーから隠蔽されます。
