我在“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;操作员在开始。
感谢帮助。
哈里什
答案 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
的第一个重载导致零除,这不是这种情况。