2

我在“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)
}

书确实说由于特定原因无法编译,但我不了解模板语法以及如何在开头使用 & 运算符调用函数。

感谢帮助。

哈里什

4

1 回答 1

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 = 3for I=4

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

我猜这本书假设代码不会编译,因为尝试实例化第一个重载导致被零除I=4,但事实并非如此。

于 2013-09-11T19:48:46.593 回答