这个问题在访谈中: 这段代码是否会导致编译/链接错误,为什么会这样?
template <int T> void f();
template <> void f<0>() {}
void test()
{
f<1>();
}
Run Code Online (Sandbox Code Playgroud)
请解释一下这种行为.非常感谢.
For*_*veR 20
template<> void f<0>() {}
Run Code Online (Sandbox Code Playgroud)
是参数的函数模板的特化0,如果调用f<0>()此版本的函数将被调用.
这段代码不正确,它会导致链接错误,因为没有专门化,f<1>而模板版本的函数则没有defined.
它将编译(所有代码在格式上都有效)但在链接阶段将失败.
这是因为template <int T> void f();声明,但没有定义的,<0>专业化的定义但都没有什么给你,因为你没有将其实例化.
事实上,这将有可能为<0>专业化含有语法错误和程序将仍然无错地编译!这是因为正式地,模板只有在使用时才会被编译.(我不希望候选人在面试条件中表现出来,以指出这一点.)
| 归档时间: |
|
| 查看次数: |
14471 次 |
| 最近记录: |