gpt4 book ai didi

c++ - SFINAE 关于具有默认参数的函数 - 自由函数与运算符()

转载 作者:IT老高 更新时间:2023-10-28 21:56:29 25 4
gpt4 key购买 nike

我在玩this answer研究它如何处理具有默认参数的函数。令我惊讶的是,自由函数和 operator() 的结果不同:

template <typename F>
auto func(F f) -> decltype(f(42))
{
int a = 51;
return f(51);
}

template <typename F>
auto func(F f) -> decltype(f(42, 42))
{
int a = 0;
int b = 10;
return f(a, b);
}

int defaultFree(int a, int b = 0)
{
return a;
}

auto defaultLambda = [](int a, int b = 0)
{
return a;
};

int foo()
{
return func(defaultFree);
//return func(defaultLambda);
}

Godbolt link

上面的 func(defaultFree) 版本在两个 func 模板都可用时编译。正如预期的那样,它选择了第二个,因为默认参数不被视为函数签名的一部分。实际上,删除第二个 func 模板会导致编译错误。

但是,func(defaultLambda) 确实 not compile由于歧义:两个 func 模板匹配。删除其中任何一个都可以编译此版本。

(当然,如果您手动编写具有类似 operator()struct,也会发生同样的情况。最新的 gccclangMSVC 也都同意。)

operator() 的未评估 SFINAE 上下文中考虑默认参数而不是自由函数的原因是什么?

最佳答案

当您将自由函数作为参数传递时,它会进行函数到指针的转换。发生这种情况时,默认参数( which is not a part of the function's type )就消失了。它现在是一个指向带有两个参数的函数的指针,因此只有一个 SFINAE 检查可以通过它。

lambda 的类型没有经过这样的调整。未求值的表达式必须涉及 operator() 的重载解析,并找到带有默认参数的声明,这允许在带有单个参数的调用中使用它。

当无捕获 lambda 被迫转换为函数指针时(例如 func(+defaultLambda);,由 @YSC 提供),出于同样的原因,歧义消失了。

关于c++ - SFINAE 关于具有默认参数的函数 - 自由函数与运算符(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52370305/

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