私はtwo phase name lookupで研究していました。非常に論理的な説明は、の早い段階でエラーをキャッチするC++の哲学であるに従っていることを示すために、one of the main reasoningがそれであることを示しています。テンプレート化されたクラスの不適切な非テンプレート化メソッドのインスタンス化
私の質問は、なぜこの考え方がテンプレート化されていない方法ではないかということです。いつメソッドが呼び出されたかをチェックするのではなく、テンプレート化されたクラスがインスタンス化されたときに、フェーズ2のテンプレート化されていないメソッドをすべてチェックしてみませんか?
例えば:
template <class T>
struct X {
auto foo() // non-templated (important)
{
T t{};
return t.non_existing();
}
};
int main()
{
X<int> x; // (1) this compiles OK.
// somewhere is a galaxy far far away,
// maybe deep inside some unrelated code
x.foo(); // (2) the error is here
}
あなたはfoo
がインスタンス化X<int>
ため違法であるが、(2)プログラムは、コンパイルし、何の問題もなく動作します書くことがない場合。
foo
に電話したかどうかに関係なく、回線(1)にエラーが発生するはずです。
テンプレート化されたクラスを書くときに、テンプレート化されたクラス(1)をインスタンス化するときにエラーが発生する代わりに、問題のあるメソッド(2)を最後に呼び出すまで、
また、X<int>
(1)をインスタンス化してもX<int>::foo
(2)をコールしないとコードが有効ですか?それとも、 "病気で、診断は必要ない"のようなものですか?後者の場合、これはエラーを早期にキャッチするさらに多くの理由です。
正常性チェック:コード(1)が有効です。理由: '' std :: vector 'のコピーコンストラクタを、コピーできない' T'のために無効化しなければならないと書いたとします。 'push_back(const T&)'などのためのDtto –
Angew
@Angew SFINAEでメソッドを無効にすることによって管理されていると想像しました。 – bolov