C++ 移行ガイド

第 5 章 C++ 3.0 から C++ 5.0 への移行

ここでは、C++ 3.0 または 3.0.1 コンパイラ用に作成したコードを C++ 5.0 用に移行するときのいくつかの注意事項について説明します。

C++ 3.0 コンパイラ以降に追加されたキーワード

C++ 3.0 コンパイラ以降に C++ に追加されたキーワードは、次のとおりです。これらのキーワードを識別子として使用している場合は、名前を変更してください。表 3-1 で説明しているように、C++ 5.0 では一部のキーワードを無効にすることができます。


bool、false、true 
const_cast、dynamic_cast、reinterpret_cast、static_cast 
explicit 
export 
mutable 
namespace、using 
typename 
wchar_t 

ソースコードの非互換性

C++ 3.0 コンパイラ用に作成したコードを C++ 5.0 コンパイラでコンパイルするには、次の変更が必要です。

Cfront のリンク時のインスタンス化

Sun C++ コンパイラのテンプレートは、AT&T の Cfront コンパイラのものとは異なります。Cfront では、リンク時インスタンス化という方式が採用されており、次のようなアルゴリズムになっています。

  1. すべてのユーザーソースファイルをコンパイルする。

  2. プリリンカー (リンクの前処理をするプログラム) を使用して、手順 1 で作成されたすべてのオブジェクトファイルをリンクし、部分リンク済みの実行可能ファイルを作成する。

  3. リンク出力を調べて、ソース中で使用されているテンプレートが存在する、未定義のすべての関数をインスタンス化する。

  4. 作成されたすべてのテンプレートと、手順 2 で作成された部分リンク済みの実行可能ファイルをリンクする。

  5. ソース中で使用されているテンプレート関数が存在する、未定義の関数がなくなるまで、手順 3 と 4 を繰り返す。

  6. 作成されたすべてのオブジェクトファイルに対してリンクを行う。

リンク時インスタンス化の最大の利点は、特殊化 (インスタンス化されたテンプレート関数を無効にするための、ユーザー提供の関数のこと) を処理するための特別な外部サポートが必要ないという点です。コンパイラによるインスタンス化の対象になるのは、ユーザーソースファイルに定義されていない関数だけです。

しかし、リンク時インスタンス化には次の 2 つの大きな欠点もあります。