c++ - 参数包函数参数可以默认吗?

标签 c++ c++11 gcc clang variadic-templates

这是 gcc 4.9.2 和 clang 3.5.2 的重点 分歧。程序:

template<typename ...Ts>
int foo(int i = 0, Ts &&... args)
{
    return i + sizeof...(Ts);
}

int main()
{
    return foo();
}

编译时没有来自 gcc 的注释 (-std=c++11 -Wall -pedantic)。 Clang 说:

error: missing default argument on parameter 'args'

foo修改为:

template<typename ...Ts>
int foo(int i = 0, Ts &&... args = 0)
{
    return i + sizeof...(Ts);
}

clang 没有提示,但 gcc 说:

error: parameter pack ‘args’ cannot have a default argument

哪个编译器是正确的?

最佳答案

从 8.3.6 ([dcl.fct.default])/3:

A default argument shall not be specified for a parameter pack.

从 8.3.6 ([dcl.fct.default])/4:

In a given function declaration, each parameter subsequent to a parameter with a default argument shall have a default argument supplied in this or a previous declaration or shall be a function parameter pack.

所以这允许像 void f(int a = 10, Args ... args) 这样的代码,或者确实像你的第一个片段。 (感谢@T.C. 查找第二句话!)

关于c++ - 参数包函数参数可以默认吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29098835/

相关文章:

c++ - "i"在当前上下文中不可用

c++ - 我无法编译从互联网下载的 Qt 项目

c++ - 从 Vector 内部的结构获取浮点值

c++ - C++ 中的 cos^-1 错误值

c++ - 从重载函数中选择常量表达式?

visual-studio - 参数包扩展失败

c++ - tbb::parallel invoke 仅执行一次函数

C++ 结构隐式转换

c++ - 64位系统上的NULL定义问题

c++ - boost1.44.0 文件系统 v3 无法在 solaris sparc 64 位平台上正常运行