为什么 g++ 将函数报告为具有 int ()() 类型
Why does g++ report a function as having type int ()()?
$ 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 ()()
中额外的一对括号是否有一些意义/含义?
这个语法的思想是这样的:
- 内括号表示我是一个函数
- 左侧的
int
表示我的返回类型为int
- 正确的一对括号意味着我没有争论
因此,如果该函数已声明为
int return1(int a)
错误消息将谈论int ()(int)
。
但是函数类型的表示方式确实取决于编译器和版本。 例如,我刚刚尝试的GCC 4.5.1只是简单地说int()
,正如您建议的那样更直观。
函数指针将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; };
在启用 C++11 的编译器上,错误消息中的int()()
表示"可调用元素(第一个()
(不带任何参数(第二个()
(返回 int.(C++03 和 C99 函数指针(如 int(*)()
是自引用的,并且调用 int(*((( 或 int(&((( 是相同的,因此需要统一消息(
这就是return1
实际含义(函数指针或引用(。由于int
不是"复合类型",编译器抱怨.
和下面的成员。
相关文章:
- 为什么 int 类型的枚举类值不能用作 int
- 如何将文本文件的特定行读取到 int 类型的数组中C++?
- int* 和 int[] 类型对二进制运算符 + 的操作数无效
- 比较两个整数在C++中与未知 int 类型的相等性
- 二进制'operator+' 'int*'和'int*'类型的无效操作数
- 使用元编程选择 int 类型,将生成错误
- 从数组创建 Mat 时,'cv::Mat' 和 'int' 类型不兼容
- 复制初始化 - 从 'int' 类型转换为非标量类型
- 初始化cv :: mat ::具有int类型的定义大小的人
- 处理代码重新定义int类型(uint16_t,int16_t等),并不喜欢它
- 为什么没有"int"类型声明时输出不同?
- 在大型程序中将长变量更改为 int 类型
- 无法将 int 类型转换为时间类型(我的类类型)
- C++:无法在按位函数后将 int 类型设置为非标量
- 无法分配给INT类型的成员[10]
- C++ cin 将字符串读取到 int 类型中返回 0
- 为什么 decltype((i)) 是引用类型,而 decltype(i+0) 是 int 类型
- 使用4用于循环的4矩阵上的数组下标的“ int [int]类型”
- std::is_arithmetic 为通用 lambda 中的 int 类型返回 false:未定义的行为?
- 正在施放带有“ Int”类型的临时性