加入SO后,每当我打开讨论模板的主题时,我都会经常看到这种语法。我尝试在谷歌搜索,但徒劳无功。
template<typename T>
char (&f(T[1]))[1]; //what is it? what is the use of '[]' brackets and the integer in it?
template<typename T>
char (&f(...))[2]; //not this either
int main() { char c[sizeof(f<void()>(0)) == 2]; } // and this?
从这里开始:SFINAE with invalid function-type or array-type parameters?
请解释我发表评论的3行。我特别想了解语法。我们可以只在模板中使用这种语法吗?
答案 0 :(得分:4)
以下两个是等效的
// 1
template<typename T>
char (&f(...))[2];
// 2
typedef char rettype[2];
template<typename T>
rettype &f(...);
您可能在使用函数指针之前已经看过该模式
char (*XXX)();
现在只需将()
替换为[N]
以创建数组而不是函数部分,并将*
替换为&
以创建引用而不是指针,并用函数声明符替换XXX
。然后,您将获得一个函数,该函数返回对大小为N
的数组的引用。
您可能需要查看man signal
,其中包含类似类型的函数声明。如果取出实际声明该函数的内部声明符,则会得到相同的模式
void (* signal(int sig, void (*func)(int)) )(int);
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ take out that
它将返回一个指向函数的指针,该函数接受int
并返回void
,如该联机帮助页中所述。
如果某些条件不满足,以下只是产生编译器错误的一种方法。 如果测试foo == 2
原来是false
,则创建的数组大小为零,这在C ++中是非法的,并且会产生编译时错误。如果它的计算结果为true,则除了声明的数组外没有任何反应。
char c[some silly condition here];