後續的代碼不能編譯,因爲結構A
不支持--
操作。如果方法沒有進行類型檢查,爲什麼C++模板匹配?
struct A {};
struct B {
void Run() {}
A& Dec(A& a) { return --a; }
};
int main(int argc, char** argv) {
B b;
b.Run();
}
與此密碼相同。
struct A {};
template <class T>
struct B {
void Run() {}
A& Dec(A& a) { return --a; }
};
int main(int argc, char** argv) {
B<A> b;
b.Run();
}
那麼爲什麼這個編譯(在C + + 11)?
struct A {};
template <class T>
struct B {
void Run() {}
T& Dec(T& a) { return --a; }
};
int main(int argc, char** argv) {
B<A> b;
b.Run();
}
看來,實例化的模板不自動實例依賴於類型參數類型檢查,這意味着如果它的一些方法沒有模板甚至會匹配模板內未使用的方法。這是令人失望的,因爲我希望用SFINAE檢測的各種方法和運營商類型的適用性,但如果模板替換成功,即使到方法的調用將編譯時錯誤,該技術將無法正常工作。
您仍然可以使用SFINAE來完全刪除「無效」方法。目前,檢測「B :: Dec(A&)」的存在將會成功。 – Jarod42
您也可以強制實例化模板類以獲取錯誤:'template class B ;'。 – Jarod42
[是否爲未使用的模板類方法生成了目標代碼?](https://stackoverflow.com/questions/183108/is-object-code-generated-for-unused-template-class-methods) – AndyG