Show page source of インテル_コンパイラーで試す次世代C__規格「C__0x」_p2 #49280

[[PageNavi(NavigationList)]]


==== インテル コンパイラー 11.1がサポートするC++0xの新機能 ====
 インテル コンパイラーが先行サポートしている機能についてはインテル コンパイラーのヘルプに簡単に記載されているが、これらを機能/目的別に分類すると次の'''表1'''のようになる。

{{{ html
<h6>表1 インテル コンパイラー 11.1がサポートするC++0xの新機能</h6>
<table class="wikitable" border="1">

<tr><th>「C99」仕様のサポート</th></tr>
<tr><td>関数型マクロを引数なしで呼び出せるようになった</td></tr>
<tr><td>可変個数の引数を持つマクロ</td></tr>
<tr><td>「long long」型</td></tr>
<tr><td>enum型の宣言で最終要素に「,」を付けることが許可された</td></tr>
<tr><td>文字列定数とワイド文字列定数の結合</td></tr>
<tr><td>関数名を文字列として返す「!__func!__」マクロ</td></tr>
<tr><th>テンプレート機能の改善/拡張</th></tr>
<tr><td>テンプレートパラメータを「friend」として宣言できるようになった</td></tr>
<tr><td>テンプレートクラスを引数に持つテンプレート宣言内で「gt;gt;」が「operatorgt;gt;」と解釈される問題の解消</td></tr>
<tr><td>「typename」の使用ルール緩和</td></tr>
<tr><td>「template」キーワードの使用ルール緩和</td></tr>
<tr><td>テンプレートのインスタンス化を遅延させる「extern template」構文</td></tr>
<tr><th>ジェネリックプログラミング機能の強化</th></tr>
<tr><td>「auto」型の利用</td></tr>
<tr><td>オブジェクトの型を返す「decltype」演算子</td></tr>
<tr><td>ラムダ関数(無名関数)の定義</td></tr>
<tr><th>より明瞭かつ高パフォーマンスなコードを記述する仕組みの追加</th></tr>
<tr><td>右辺値クラスへのバインド</td></tr>
<tr><td>コンパイル時に静的チェックを行う「static_assert」機能</td></tr>
<tr><td>直接参照における呼び出し可能でないコピーコンストラクタの許可</td></tr>

</table>
}}}
 C++0xでは、1999年にISO/IEC 9899:1999として発行されたCの標準仕様「C99」にすでに含まれていた機能が取り入れられているほか、テンプレート機能がより使いやすくなり、また現行のC++標準規格で規定されていた各種制限が緩和されている。下記では、これらのうち注目すべき機能について簡単に紹介しておこう。

==== コンパイル時に推論によって自動的に型が決定される「auto」型 ====
 C++0xでは「auto」型という、コンパイル時に型推論によって決定される型を利用できるようになった('''リスト1''')。

====== リスト1 「auto」型の利用例 ======

{{{
    int x = 10;
    int y = 20;
    auto z = x + y;  // コンパイル時に型が決定され、zはint型変数となる
}}}

 たとえば'''リスト1'''の場合、auto型として宣言されている変数zに対してコンパイル時に型推論が行われ、その結果zはint型の変数として割り当てられるようになる。

==== インスタンスの型を返す「decltype」演算子 ====
 C++0xで新たに導入された演算子「decltype」は、引数で指定したインスタンスの型を返す働きをするものだ。C/C++に従来からあったsizeof演算子と同様、コンパイル時に評価が行われ、引数で指定した変数の型を表す文字列に置き換えられる

 たとえば'''リスト2'''は、decltypeを利用して変数の型を指定する例だ。

====== リスト2 decltype演算子の利用例 ======

{{{
    double p;
    decltype(p) q;  // コンパイル時に型が決定され、qはpと同じdouble型変数となる
}}}

 この例では、qはpと同じdouble型の変数として割り当てられる。

==== 「[]」を使用したラムダ関数(無名関数)の定義 ====
 ラムダ関数(無名関数)を定義する仕組みも新たに用意された。C++0xでは、次のように「[]」を使用して無名関数を定義できる。

{{{
[](<引数>) - <戻り値の型> { 関数の中身 };
}}}

 無名関数はauto型の変数に格納でき、またその変数を介して呼び出すことができる('''リスト3''')。

====== リスト3 ラムダ関数の利用 ======

{{{
    // 引数としてint型の値2つを取り、int型の値を返す無名関数を定義
    auto hoge1 = [](int x, int y) - int { return x + y; };

    // 引数としてint型の値2つを取り、int型の値を返す無名関数を定義(戻り値の型を省略)
    auto hoge2 = [](int x, int y) { int z = x * y; return z + x; };

    int x = hoge1(2, 1);
    int y = hoge2(2, 1);
    printf("x%d, %d.\n", x, y );  //実行結果は「3, 4」となる
}}}

 たとえばSTLなどのテンプレートライブラリでは、関数オブジェクトを引数として取る関数があるが、それに対して無名関数を関数オブジェクトの代わりに利用することが可能だ。これによって、より簡潔に処理を記述できるようになる。

==== コンパイル時にエラーチェックを実行する「static_assert」 ====
 「static_assert」という、コンパイル時に動的なエラーチェックを行う機構も追加された。static_assertの構文は次の通りだ。

{{{
static_assert(<評価する式>, <エラーメッセージ>)
}}}

 static_assertは、「評価する式」をコンパイル時に評価し、その値が偽の場合に「エラーメッセージ」で指定した文字列を表示してコンパイルエラーを発生させるものだ。評価する式では「==」や「!=」、「」、「」といった比較演算子が利用できる。また、「エラーメッセージ」には通常文字列型でメッセージを指定する。

 たとえば次の'''リスト4'''は、コンパイル時に「CHAR256」型のサイズを確認するものだ。

====== リスト4 static_assertの使用例 ======

{{{
typedef struct {
    char sz[256];
} CHAR256;

static_assert(sizeof(CHAR256) == 256, "invalid size - CHAR256.");
}}}

 この例では、CHAR256のサイズが256でない場合、コンパイル時に「"invalid size - CHAR256."」というメッセージが表示され、コンパイルエラーとなる。



[[PageNavi(NavigationList)]]