$ cat -n cons.cpp
1 #include <iostream>
2
3 using namespace std;
4
5 int return1() {
6 return 1;
7 }
8
9 int main() {
10 cout<< return1.m_one << endl;
11 return 0;
12 }
$ g++ cons.cpp
cons.cpp: In function 'int main()':
cons.cpp:10: error: request for member 'm_one' in 'return1',
which is of non-class type 'int ()()'
$
也许这是编译器特定的,但是上面的g ++报告的int ()()
中额外的括号对有一些意义/含义吗?
答案 0 :(得分:5)
函数指针为int (*)()
。 int ()()
不是合法语法,但我可以看到类型漂亮的打印机如何为函数类型输出它。
如果类型声明符合法,这种语法实际上意味着:
function taking no arguments
↓↓
int ()()
↑↑↑ ↑↑
and returning int(), i.e. a function that takes no argument and returns int.
但是在C和C ++中,函数被禁止直接返回函数,而是必须返回指向函数的指针。同样,您无法直接返回数组(int ()[10]
)
函数类型实际拼写的方式没有这些括号中的一个。例如,当声明std::function
↓↓↓↓↓
std::function< int() > foo = []() -> int { return 1; };
答案 1 :(得分:5)
这种语法的想法是:
int
表示我的回复类型为int
因此,如果该函数已声明为
int return1(int a)
错误消息会谈到int ()(int)
。
但函数类型的表示方式确实取决于编译器和版本。例如。我刚刚尝试的GCC 4.5.1只是简单地说int()
,因为你建议更直观。
答案 2 :(得分:1)
在启用了C ++ 11的编译器上,错误消息中的int()()
表示“可调用元素(第一个()
)没有参数(第二个()
)返回int。”(C ++ 03和int(*)()
这样的C99函数指针是自解引用的,调用int(*)()或int(&amp;)()是相同的,因此需要统一消息)
这是return1
实际上是(函数指针或引用)。由于int
不是“复合类型”,编译器会抱怨.
和以下成员。