She*_*evy 10 c++ typedef function-declaration
从ISO/IEC 14882:2011(E)的§8.3.5.11开始:
函数类型的typedef可用于声明函数,但不得用于定义函数
标准继续给出这个例子:
typedef void F();
F fv; // OK: equivalent to void fv();
F fv { } // ill-formed
void fv() { } // OK: de?nition of fv
Run Code Online (Sandbox Code Playgroud)
这条规则的动机是什么?它似乎限制了函数typedef的潜在表达用途.
Yu *_*Hao 12
虽然这个问题是关于C++的,但是由于C++继承了C语言typedef并且函数指针,所以在这里可以使用C中相同问题的解释.对C有一个正式的解释.
国际标准的基本原理 - 编程语言 C§6.9.1 函数定义
参数列表必须明确存在于声明符中; 它不能从a继承
typedef(见§6.7.5.3).也就是说,给定定义:Run Code Online (Sandbox Code Playgroud)typedef int p(int q, int r);以下片段无效:
Run Code Online (Sandbox Code Playgroud)p funk // weird { return q + r ; }一些当前的实现重写了一个类型,例如,一个
char参数就像它被声明一样int,因为已知参数int在没有原型的情况下被传递.但是,标准要求将收到的参数转换为就像在函数输入时的赋值一样.因此不再允许类型重写.
这可能主要是历史原因.typedef是C的相对较晚的添加,并且被添加到现有语言上(并且在编译器的解析阶段引起了一些问题).
此外,函数定义必须定义参数的名称(如果有).函数类型包括函数的返回类型和参数类型,但不包括其参数名称.例如,这些:
void (int)
void (int x)
void (int y)
Run Code Online (Sandbox Code Playgroud)
有三种编写相同功能类型的方法.如果你有:
typedef void func_t(int);
Run Code Online (Sandbox Code Playgroud)
然后这个假设的定义:
func_t some_func { }
Run Code Online (Sandbox Code Playgroud)
不会为其int参数定义名称.我不确定如何以合理的方式解决这个问题.我想,这是可能的,但它从未完成过.
但最重要的可能就是Dennis Ritchie要么不认为定义如何typedef在函数定义中使用它,或者他根本没有想到它.
| 归档时间: |
|
| 查看次数: |
1471 次 |
| 最近记录: |