下面的代码是我正在经历的 cpp 测验的一部分:
#include <iostream>
template<typename T>
void foo(T)
{
std::cout << "T" << std::endl;;
}
struct S
{
};
template<typename T>
void call_foo(T t)
{
foo(S());
foo(t);
}
void foo(S)
{
std::cout << "S" << std::endl;
}
int main()
{
call_foo(S());
}
我不明白为什么输出结果是TS
。我预计它会是SS
编译器:gcc版本4.8.5 20150623
§14.6¶9 规定:“当寻找在一个名称中使用的名称的声明时
模板定义,使用通常的查找规则(§3.4.1,§3.4.2)
对于非从属名称。依赖于模板的名称查找
参数被推迟,直到知道实际的模板参数
(第 14.6.2 节)。”
对 foo 的第一次调用是非依赖调用,因此在定义函数模板时查找它。在第二次调用的情况下,它会被推迟到实例化模板为止,因为它依赖于模板参数。
template<typename T> void call_foo_function(T t)
{
foo(S()); // Independent, looks up foo now.
foo(t); // Dependent, looks up foo later.
}
当在定义函数模板时查找 foo 时,唯一存在的 foo 版本是模板化的 foo(T)。具体来说,foo(S) 尚不存在,并且不是候选者。
有趣的是检查你的代码在 Visual Studio 中的输出,我认为在这种情况下它会输出SS
你所期望的。
答案来源:CPPQuiz http://cppquiz.org.
不幸的是,我不再有答案的确切链接,因为我无法再次找到它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)