0

再帰的なデータ構造を操作するテンプレート関数があります。呼び出された最初の関数には、次のような形式があります。

template <unsigned Pos, typename... Ps>
auto get(param<Ps...> i) -> int
{
    static_assert(Pos < sizeof...(Ps), "Error message");
    return helper<Pos>(i.rest);
}

私が遊んでいる特定のケースでhelper<Pos>(i.rest)は、データ構造の終わりを超えようとするため、コンパイルに失敗することがわかっています。

static_assert でコンパイルが停止すると予想していましたが、テンプレートがインスタンス化され、static_assert をチェックする前に失敗したようです。実際の正しい動作は何ですか?

GCC 4.7.3 を使用しています。

4

2 に答える 2

2

static_assertテンプレートのインスタンス化に関連する sの評価順序などというものはありません。static_assert標準では、コンパイル時に の最初のパラメーターの式が false と評価された場合、プログラムの形式が正しくなく、診断に 2 番目のパラメーターのテキストを含める必要があると単純に述べられています。

つまり、static_assert(false)構文エラーまたは整形式制約のその他の違反と同じように扱われます。当然のことながら、プログラムを不適切な形式にするエラーが複数ある場合、標準では、コンパイラがエラーの診断を発行する順序や、エラーごとにメッセージを発行するかどうかさえ指定していません。

于 2013-11-13T00:28:25.243 に答える
0

@Igorの答えに、GCCコンパイラの最初のパスは、定義ではなく関数宣言のみがあるかのように追加できます。そのため、関数本体を調べずにコードをインスタンス化する場合があります。このレベルで何かが失敗した場合、それは奥に進まない可能性があります。

于 2013-11-13T01:33:45.647 に答える