gpt4 book ai didi

c++ - 为什么函数默认参数不能在C++中完美转发?

转载 作者:可可西里 更新时间:2023-11-01 18:26:11 24 4
gpt4 key购买 nike

从我的角度来看,我发现了非常奇怪的行为:无法在下面的代码中转发函数默认参数。

void Test(int test = int{}) {}

template<typename F, typename ...Args>
void Foo(F&& f, Args&&... args)
{
std::forward<F>(f)(std::forward<Args>(args)...);
}

int main()
{
Foo(Test, 0); // This compiles
Foo(Test); // This doesn't compile
}

Clang 报告:错误:函数调用的参数太少,预期为 1,实际为 0GCC 和 VC 报告相同的错误。

谁能解释一下?

代码在这里: http://rextester.com/live/JOCY22484

最佳答案

Test 是一个总是接受一个参数的函数。如果在按名称调用 Test 时它的默认参数声明可见,编译器将隐式地将默认参数添加到调用中。但是,一旦 Test 被转换为指针或函数引用,默认参数信息就不再可见。

这可以通过创建一个真正接受零个或一个参数的仿函数来解决,并将该信息编码到它的类型中,这样它就不会被破坏,就像这样:

struct Test {
void operator()(int) { /* ... */ }
void operator()() { operator(int{}); }
} test;
// ...
Foo(test, 0); // ok
Foo(test); // ok

关于c++ - 为什么函数默认参数不能在C++中完美转发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45068265/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com