具有可变数量的参数的函数,没有任何显式参数

Que*_*low 2 c++ function

如何在C++的工作与功能的格式如下:void function(...) {}

真的需要至少一个隐含参数吗?

dyp*_*dyp 5

重复评论:

似乎有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)
  • 实现定义的技巧.您的实现可能提供访问与省略号匹配的参数的方法.例如,参见BobTFish例子