ホームページ > バックエンド開発 > C++ > C 11 テンプレート置換エラーがハード エラーかソフト エラーかを決定するものは何ですか?

C 11 テンプレート置換エラーがハード エラーかソフト エラーかを決定するものは何ですか?

Patricia Arquette
リリース: 2024-12-18 19:03:11
オリジナル
337 人が閲覧しました

What Determines Whether a C  11 Template Substitution Error Is a Hard or Soft Error?

C 11 テンプレート置換における即時コンテキスト

C 11 標準では、置換失敗はエラーではない (SFINAE) が導入されています。テンプレート引数置換中のハード コンパイル エラーの抑制。ただし、標準では SFINAE が適用される特定の「即時コンテキスト」が定義されているため、置換エラーがいつハード エラーまたはソフト エラーにつながるかについてはいくらか不確実性が残ります。

即時コンテキスト定義

標準では、直接コンテキストを次のように定義しています。

「コンテキストの直接コンテキストでは無効な型と式のみ」関数の型とそのテンプレート パラメーターの型は推論に失敗する可能性があります。"

この定義は曖昧ですが、非規範的な注記がヒントを提供します:

"置換された型とそのテンプレートのパラメーターの型の評価式は次のような副作用を引き起こす可能性があります... このような副作用は「直接のコンテキスト」にはないため、プログラムが不正な形式です。"

決定手順

即時コンテキストで置換エラーが発生するかどうかを判断するには、次の決定手順を検討してください。

  • ステップ 1: を決定するために必要なすべてのテンプレートと暗黙的に定義された関数を特定します。置換の結果。
  • ステップ 2: 置換が開始される前にこれらのエンティティが生成されると想像してください。
  • ステップ 3: この間にエラーが発生した場合仮説の生成は、直接的なコンテキストに含まれないため、困難な結果が生じる可能性があります。エラー。
  • ステップ 4: すべてのエンティティがエラーなしで生成された場合、置換中の後続のエラーはエラーではなく、引数推定エラーになります。

  • 難しいエラー: func> - A のインスタンス化参照へのポインタが許可されていないため、失敗します。
  • 引数推定失敗: func> - A のインスタンス化成功しますが、A::type が存在しません。
  • 引数推定失敗: class B { void f(int); }; func::f - f の暗黙的な定義により、削除されたメンバー関数が生成されます。

結論

即時コンテキストの概念を理解し、上記の決定手順により、プログラマは置換エラーがハード エラーまたはソフト エラーを引き起こす時期をより適切に予測できるようになり、C 11 で SFINAE をより効果的に使用できるようになります。テンプレート。

以上がC 11 テンプレート置換エラーがハード エラーかソフト エラーかを決定するものは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート