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_start
,va_args
和va_end
宏从<stdarg.h>
(这里<cstdarg>
)头。否则,它甚至不会编译。
C++ 是否对“纯省略号”形式有一些特殊处理,或者它不适合获取参数,即它是允许的,但完全不切实际?
此处解释了 C++ Variadiac 参数。C++ 支持此语法,但无法访问参数:
在 C 编程语言中,至少一个命名参数必须出现在省略号参数之前,所以
printz(...);
是无效的。在 C++ 中,即使传递给此类函数的参数不可访问,也允许这种形式,并且通常用作 SFINAE 中的回退重载,利用重载解析中省略号转换的最低优先级。这种可变参数的语法是在 1987 C++ 中引入的,省略号前没有逗号。当 C89 采用 C++ 的函数原型时,它将语法替换为需要逗号的语法。为了兼容性,C++98 接受 C++-style
f(int n...)
和 C-stylef(int n, ...)