没有命名参数的可变参数函数

Grz*_*ski 7 c++ variadic-functions

我注意到,GCC 和 MSVC 都对以下代码感到满意:

#include <iostream>
void foo(...);

int main()
{
    foo();
}

void foo(...)
{
    std::cout << "foo\n";
}
Run Code Online (Sandbox Code Playgroud)

更具体地说,代码在 GCC 6.2.0 和 Visual Studio 2015 下运行。

我知道,C需要至少一个命名参数省略号,它允许处理使用专门的任意数量的参数之前va_startva_argsva_end宏从<stdarg.h>(这里<cstdarg>)头。否则,它甚至不会编译。

C++ 是否对“纯省略号”形式有一些特殊处理,或者它不适合获取参数,即它是允许的,但完全不切实际?

pau*_*l-g 7

此处解释了 C++ Variadiac 参数。C++ 支持此语法,但无法访问参数:

在 C 编程语言中,至少一个命名参数必须出现在省略号参数之前,所以 printz(...);是无效的。

在 C++ 中,即使传递给此类函数的参数不可访问,也允许这种形式,并且通常用作 SFINAE 中的回退重载,利用重载解析中省略号转换的最低优先级。这种可变参数的语法是在 1987 C++ 中引入的,省略号前没有逗号。当 C89 采用 C++ 的函数原型时,它将语法替换为需要逗号的语法。为了兼容性,C++98 接受 C++-stylef(int n...)和 C-stylef(int n, ...)