gpt4 book ai didi

c++ - 重载决议如何与可变函数一起工作?

转载 作者:太空狗 更新时间:2023-10-29 23:50:59 30 4
gpt4 key购买 nike

假设我有这个程序:

#include <iostream>

int fun(...) {return 0;}

template <typename... Args>
int fun(const Args&...) {return 1;}

int fun(const double val) {return 2;}

int main()
{
std::cout << fun(1,2,3) << fun(1) << fun(1.0);
return 0;
}

此程序返回以下内容:

112

我理解为什么 fun(1.0) 会返回 2,因为这是最接近的匹配函数候选者,但为什么前两个示例返回 1?

此页面 ( http://en.cppreference.com/w/cpp/language/overload_resolution) 提供了函数重载规则的引用,但似乎没有涵盖可变参数。在哪里可以找到可变参数/模板可变参数函数的重载规则?

最佳答案

why do the first 2 examples return 1?

C 风格的可变参数函数总是最差的匹配(从技术上讲,它涉及一个“省略号转换序列”,比任何标准或用户定义的转换序列都差)。对于 fun(1, 2, 3),使用可变函数模板,推导照常执行,给出 Args = int, 整数, 整数。这是完全匹配。

对于 fun(1),可变参数函数模板再次获胜,因为 Args 被推导为 int 并且我们再次获得完全匹配,这比调用 fun(double) 所需的浮点整数转换要好。

Where can I find out the rules for overloading of variadic / template variadic functions?

您链接的页面已经涵盖了您需要了解的有关 C 样式可变参数函数的内容:

1) A standard conversion sequence is always better than a user-defined conversion sequence or an ellipsis conversion sequence.

2) A user-defined conversion sequence is always better than an ellipsis conversion sequence

对于可变参数模板,实际上没有任何特殊规则;模板参数推导像往常一样执行,然后应用通常的重载解析规则。

在这种情况下规则会变得更加复杂:

template <class... Args> int f(Args...) { return 1; }
template <class T> int f(T) { return 2; }
f(1); // returns 2

在这种情况下,通常的规则无法解决重载问题,但选择了第二个函数,因为它“更专业”。确定一个函数模板何时比另一个函数模板更专业的规则(在我看来)很难理解。您可以在 C++11 标准的 §14.5.6.2 [temp.func.order] 中找到它们。

关于c++ - 重载决议如何与可变函数一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24876550/

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