D 2.0
About Japanese Translation

www.digitalmars.com
Last update Tue Apr 22 23:40:56 2008

D と C++0x

C++ では現在、新しい規格 -- 通称 C++0x の策定が進められています。 この記事では、 C++0x core language changes の要点を取り上げ、現在 D にある機能と比較します。 C++0x はまだまだ完成には遠いため、 この記事の内容は新しい企画案によって obsolete となる可能性があります。ご了承下さい。 ここでは、C++0x 標準ライブラリの更新点は扱いません。 以下では、TBD は To Be Determined (未定) の略記です。

C++0x に提案されている機能

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

N2431: D はこれと同等の null があります。

強い型付けのenum

N2347: D の enum は:

  1. 異なる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
    }
    
  2. ベースとする型は指定できます。
  3. 名前付きenumは強くスコープが限られています。無名enumメンバは、 周りのスコープで宣言されます。
  4. 名前付きenumのメンバを参照するには、 明示的な就職が必要です。

friend宣言の拡張

N1791: モジュール内のコードは全て、 同じモジュール内の同一スコープで宣言された クラスや構造体の private メンバに アクセス できます。 パッケージprotectedメンバは、 同じパッケージの全てのコードからアクセスできます。 Dでは、friend 宣言を導入して 複雑な名前検索規則を扱う必要がありません。

一般定数式

N2235: D には コンパイル時間数実行 (CTFE) があります。CTFE は、より柔軟で、 コンパイル時に関数を評価することができます:

  1. 特別なキーワードは不要 (C++0x では constexpr が必要)
  2. 関数内で複数の文を実行できます
  3. 再帰も可能
  4. ローカル変数の書き換えも使えます
  5. out引数も使えます

名前空間の関連づけ ("Strong Using")

N2535: D には名前空間はないので、 これは無関係です。

C++ プリプロセッサと C99 の摺り合わせ

N1653: D にはプリプロセッサはないので、 これは無関係です。

プログラミング言語 C++ への alignment サポートの追加

N2341: D では align 属性で宣言のアラインメントを指定することができ、 また .alignof プロパティによって 式や型のアラインメントを得ることができます。

条件的にサポートされる動作

N1627: D では、pragma などでベンダ特有の動作を行うことが許されています。

未定義動作をエラーに

N1727: D では整数リテラル型、 文字エスケープ、... に非POD型を渡す場合に未定義動作はありません。

C++ への long long 型の追加

N1811: D の long 型が同等のものです。

C++ への拡張整数型の追加

N1988: D では cent と ucent 型が 128 bit 整数型として用意されています (dmdやgdcでは未実装です)。 その他の拡張整数型の提案はありませんが、 言語コアにさらにそれを追加する正当性が 思い浮かびません。

移譲コンストラクタ

N1986: D には 移譲コンストラクタ があります。

明示的変換演算子

N2437: TBD

新しい文字型

N2249: C++0x では新しい文字型 char16_t と char32_t が加わります。 これは D の wchar と dchar 型 に対応します。 リテラルの接頭辞 u と U は、 D の 接尾辞 w と d に対応します。

右 > 括弧

N1757: D ではテンプレートのインスタンス化に < > ではなく !( ) を使うため、 構文解析の曖昧性やそれを修正する必要性はありません。

初期化式から変数の型を推論

N1984: D には初期化子からの 型推論 があります。

auto宣言の構文

N2546: D の auto 宣言 には特に構文的な問題はありません。

コンストラクタの継承

N2540: TBD

制御完了点の、より粒度の高い代替案

N2239: TBD

(単相) λ式とクロージャ

N2550: D には λ式クロージャ があります。

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

N2343: Dでの同等の表現は typeof です。

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;

メンバはユーザーから隠蔽されます。