【发布时间】:2015-11-20 23:10:20
【问题描述】:
C++ Primer 5th Edition 在第 16.3 章(讨论函数模板重载的一章)末尾有一个 sn-p 建议:
在定义任何重载集之前声明重载集中的每个函数 职能。这样你就不必担心编译器是否会 在它看到你要调用的函数之前实例化一个调用。
这是否告诉我,在重载决议期间选择候选函数和可行函数时,编译器可能会实例化最终没有选择的函数模板?我试图看看这是否真的会发生:
template<class> struct always_false : std::false_type {};
template <typename T> void test(T const &){
static_assert(always_false<T>::value, "If this fires, it is instantiated");
}
template <typename T> void test(T*) { }
int main(){
int *q = nullptr;
test(q); //test(T*) should be the best match
}
如果test(T const &) 以任何形式实例化,该程序将引发编译器错误,除非程序按预期编译正常。那么这个提示试图保护我免受什么样的编译事故呢?它什么时候会在看到我试图调用的函数之前实例化一个函数?
【问题讨论】:
-
函数模板特化与重载相关文章:Why Not Specialize Function Templates?
标签: c++ templates c++11 overloading