【发布时间】:2010-05-05 16:24:59
【问题描述】:
在尝试使用 C++ 模板时,我设法生成了这个简单的代码,其输出不同于我对 C++ 规则的理解所期望的。
void bar(double d)
{
std::cout << "bar(double) function called" << std::endl;
}
template <typename T> void foo(T t)
{
bar(3);
}
void bar(int i)
{
std::cout << "bar(int) function called" << std::endl;
}
int main()
{
foo(3);
return 0;
}
当我在 VC++2008 Express 中编译这段代码时,函数 bar(int) 被调用。这将是行为,我希望模板正文中的bar(3); 依赖于模板参数。但事实并非如此。我发现here 的规则说“C++ 标准规定,在解析模板函数或类时,所有不依赖于模板参数的名称都绑定到它们当前的定义”。我错了吗,解析模板函数foo时bar的“当前定义”是
void bar(double d);?如果我错了,为什么不是这样。此编译单元中没有bar 的前向声明。
【问题讨论】:
-
如果你是对的,我不会感到惊讶。在我看来,VC++ 的模板实现完全忽略了依赖/非依赖问题。
-
VC++ 从不遵守标准的 2-passes 评估(第一次在读取模板定义时,第二次在模板实例化时)。它在某些地方节省了
typename和template的写法,但是……不合规。 -
为了精确起见,您指的是标准的第 14.6.3 节非依赖名称 [temp.nondep]。 (最终草案)