【发布时间】:2015-11-23 02:21:14
【问题描述】:
有人可以向我解释为什么 C++,至少据我所知,没有实现强类型省略号函数,效果如下:
void foo(double ...) {
// Do Something
}
意思是,简单地说:'用户可以将可变数量的术语传递给 foo 函数,但是,所有术语都必须是双精度的'
【问题讨论】:
-
我猜想可变参数函数被添加到 C 中的唯一目的是支持 printf 系列函数,它必须是类型不安全的。格式字符串 I/O 概念本身可能只是取自 C 的前辈,如 BCPL(参见 en.wikipedia.org/wiki/BCPL)。在现代 C++ 中,没有必要引入类型安全的可变参数函数,因为无论如何我们都有更好的语言结构,尤其是从 C++11 开始。不幸的是,我的猜测没有参考资料。向 Bjarne Stroustrup 本人提出这个问题会很有趣。
-
您可以使用
void foo(double *)并通过foo((double[]){1,2,3,4,5})调用它。需要 GNU C++ 扩展。 -
@ChristianHackl:没有根本原因说明 printf 系列必须是类型不安全的。 C 可以声明实现首先将“类型令牌”压入调用堆栈,以便可变参数机制可以检查堆栈上是否存在正确的值类型。这会减慢正确代码的速度,而 C 历来强烈偏好快速而不是安全。
-
@MSalters:OTOH,在编译时仍然不能保证类型安全。
-
@user3528438
template<class T> using id = T; void foo(double*); foo(id<double[]>{1,2,3,4});无需扩展即可正常工作。
标签: c++ variadic-functions ellipsis