重复评论:
似乎有C99和C++ 11这里之间的有趣的差异:C++ 11允许一个函数声明void foo(...),因为参数声明列表中的参数声明子句是可选的:[dcl.fct]
功能声明:
D1 (parameter-declaration-clause)cv-qualifier-seq opt ref-qualifier opt exception-specification opt attribute-specifier-seq opt
参数:
parameter-declaration-clause:
parameter-declaration-list opt...opt
parameter-declaration-list, ...
(注意参数声明列表和声明如何在这里...单独选择,这意味着你可以省略一个或另一个或两者.这个解释由clang ++和g ++支持.)
在C99中,不允许此声明,因为参数列表在参数类型列表中不是可选的:6.7.5/1
功能声明:
direct-declarator
(参数类型列表)
参数:
parameter-type-list:
参数列表
参数列表, ...
由于va_start等宏/函数继承自C99,因此无法在C++中使用与省略号匹配的参数和空参数声明列表.
va_startC99:7.15.1.4的描述
void va_start(va_list ap,parmN);
[...]
参数parmN是函数定义中变量参数列表中最右边参数的标识符(前一个, ...参数).[...]
强调我的.C99 假定在省略号之前有一个参数,因为在C99中声明带省略号但没有参数的函数是不合法的.
然而,我可以看到两个原因使用带省略号的函数但没有C++中的任何参数:
过载分辨率.对省略号的匹配参数导致过载的排名非常低:省略号转换序列比任何用户定义和标准转换序列[over.ics.rank]/2更差.这对于元编程非常有用:
char foo(int);
int foo(...);
struct S{};
S s;
sizeof(foo(42)); // yields 1
sizeof(foo(s)); // yields sizeof(int)
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
638 次 |
| 最近记录: |