需要帮助理解C ++代码

时间:2013-09-11 19:17:18

标签: c++ templates sfinae

我在“C ++模板 - 完整指南”中遇到了这段代码。我尽力找出是否已在某处解释过。如果已经解释过,请道歉

template<int I> void f(int (&)[24/(4-I)]);
template<int I> void f(int (&)[24/(4+I)]);
int main()
{
    &f<4>; // ERROR: division by zero (SFINAE doesn't apply)
}

本书确实说这不会因特定原因而编译,但我不理解模板语法以及如何使用&amp;操作员在开始。

感谢帮助。

哈里什

1 个答案:

答案 0 :(得分:1)

实际上,它确实可以编译。您也可以调用其中一个功能,例如以下打印+

template<int I> void f(int (&)[24/(4-I)]) { std::cout << "-" << std::endl; }
template<int I> void f(int (&)[24/(4+I)]) { std::cout << "+" << std::endl; }

int main()
{
    int a[3];
    f <4>(a);
}

无论如何,两个模板函数f都期望引用int数组,其长度取决于模板参数I。例如,我选择a[3],因为24/(4+I) = 24/8 = 3 I=4

该函数不是由&f<4>调用的,而是仅通过获取其地址(实际上对未使用的结果发出警告)进行实例化。

我想这本书假定代码不会编译,因为尝试实例化I=4的第一个重载导致零除,这不是这种情况。