web-dev-qa-db-ja.com

C ++でのテンプレート特殊化の順序

テンプレートの特殊化がコードに表示される順序によって、プログラムの意味が変わる可能性はありますか?もしそうなら、なぜですか?

例:

ソースコード内のどこか

// specialization A
...
// specialization B
...

vs.

// specialization B
...
// specialization A
...

これは常に同じ結果をもたらしますか?

14
user6646922

スペシャライゼーションに依存するコードスニペットがすでにそれらを認識している限り、順序は重要ではありません。

言い換えれば、順序は

// specialization A
// Some code where B would be a better match
// specialization B
13
Bathsheba

関数テンプレート、クラステンプレート、クラステンプレートのメンバー関数、クラステンプレートの静的データメンバー、クラステンプレートのメンバークラス、クラステンプレートのメンバークラステンプレート、クラステンプレートのメンバー関数テンプレート、メンバーのメンバー関数の明示的な特殊化宣言の配置クラステンプレートのテンプレート、非テンプレートクラスのメンバーテンプレートのメンバー関数、クラステンプレートのメンバークラスのメンバー関数テンプレートなど、クラステンプレートの部分的な特殊化宣言の配置、非テンプレートクラスのメンバークラステンプレート、メンバークラステンプレートなどのクラステンプレートは、明示的な特殊化宣言の相対的な位置と、上下に指定されている翻訳単位でのインスタンス化のポイントに従って、プログラムが整形式であるかどうかに影響を与える可能性があります。スペシャライゼーションを作成するときは、その場所に注意してください。またはそれをコンパイルさせることは、Kindleの焼身自殺のような試みになるでしょう。

2011 International Standard for Programming Language C++のセクション 14.7.3/7 を引用するだけです。

はい...これは冗談ではありません

32
Stefano