C++ 为什么可以';在没有typedef的C中,某些类型(带有数组表示法)不能用作返回类型吗?

C++ 为什么可以';在没有typedef的C中,某些类型(带有数组表示法)不能用作返回类型吗?,c++,c,C++,C,在处理类型语法时,我注意到这是合法的: typedef int *((* T)[10]); T fun(){ return 0; }; int main(int argc, char * argv[]){ //int c = fun(); // (1) return 0; } …如果您取消注释(1),则会收到此类错误消息(GCC/Clang):“错误:无法使用类型为“T”的右值初始化类型为“int”的变量”(也称为“int*(*)[10]))”(目前为止正常)。但是请注意指出该

在处理类型语法时,我注意到这是合法的:

typedef int *((* T)[10]);

T fun(){
  return 0;
};

int main(int argc, char * argv[]){
  //int c = fun(); // (1)
  return 0;
}
…如果您取消注释
(1)
,则会收到此类错误消息(GCC/Clang):“
错误:无法使用类型为“T”的右值初始化类型为“int”的变量”(也称为“int*(*)[10]))
”(目前为止正常)。但是请注意指出该类型的“
aka
”是
int*(*)[10])
的别名,而不仅仅是
int***

但是,如果不使用typedef,似乎不可能声明具有此类型的函数:

int *((*)[10]) fun(){ // The compiler does not approve
  return 0;
};

int *((* fun2)[10]) (){ // The compiler does not approve either
  return 0;
};

int main(int argc, char * argv[]){
  //int c = fun(); // (1)
  return 0;
}
…然后我想知道为什么? (这个问题是针对C语言的,但看起来对C++也是一样的)

int*((*fun())[10]){
返回0;
};
。。。是的。出于可读性考虑,您可能应该坚持使用typedef:)

此类型:

typedef int *((* T)[10]);
是指向大小为10的数组的指针,其成员类型为
int*
。这与
int***
不同

对于创建返回此类型的函数,您需要:

int *(*fun())[10] {
  return 0;
};
但是使用
typedef
会使这一点更加清晰。

原始版本

typedef int *((* T)[10])
可以卸下外皮:

typedef int *(* T)[10]
或与dbush的函数对齐:

typedef int *(*   T   )[10]
        int *(* fun() )[10]

int*(*fun2)[10])()
->
int*(*fun2())[10])
。这是一个函数,而不是数组元素
将f声明为返回指向int的指针的数组10的指针的函数
->
int*(*f())[10]
不是真的。它需要知道答案,所以它无助于找到答案。@ikegami:不管怎样,它帮助了我。我可以看出类型
T
指向数组10的指针,指向int
的指针,我们需要一个返回此类型的函数,因此我可以计算出对cdecl的查询。但是我无法说出
[10]
应该放在哪里,所以我还不知道答案。哦,天哪,我为什么不考虑把完整的参数列表放在括号里……顺便说一句,我完全同意。但这是为了测试我正在开发的代码生成工具的边缘情况……如果您使用尾随返回类型语法,那就没那么糟糕了:。它仍然很难看,但至少所有类型都在一个位置:
auto-fun()->int*(*)[10])