c++ - 忽略函数默认参数

标签 c++ c++11 templates g++

对于这段简化的代码,我收到以下错误:

error: too few arguments to function std::cout << f();

int g(int a = 2, int b = 1)
{
    return a + b;
}

template<class Func>
void generic(Func f)
{
    std::cout << f();
}

int main()
{
    generic(g);
}

我不知道为什么函数 f 的默认参数没有传递给函数 generic 的原因。它的行为就像 f 没有任何默认参数...

怎么了?

如何正确转发默认参数?

最佳答案

g可能有默认参数,但是&g的类型仍然是int(*)(int, int),不是可以不带参数调用的类型。在 generic 中,我们无法区分 - 我们已经失去了关于默认参数的上下文。

您可以将 g 包装在 lambda 中以保留上下文:

generic([]{ return g(); });

关于c++ - 忽略函数默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46205577/

相关文章:

c++ - 将双变量分配给动态双数组

c++ - 使用 zlib 编译 boost

c++ - 当我想在外面抓东西时无法编译 lambda

c++ - 为嵌套类模板重载运算符<<

c++ - 错误 C2440 : 'return' : cannot convert from 'int [2]' to 'int (&&)[2]'

c++ - 明确删除赋值运算符时允许从右值赋值?

c++ - 用模板推导,std::vector<int&>可行吗?

c++ - 带有 boolean 参数的模板

c++ - 模板元编程递归上限?

c++ - 可变参数模板和动态转换