gpt4 book ai didi

c++ - 使用模板和右值引用的重载解决方案

转载 作者:行者123 更新时间:2023-12-03 07:00:31 25 4
gpt4 key购买 nike

这种重载决议行为让我感到困惑:

#include "stdio.h"

template<class T>
class C
{
public:
C(T v): m(v) {};
T m;
template<class U>
T f(U &&p)
{
printf("rRef called.\n");
return p;
}

template<class U>
T f(const U &p)
{
printf("const Ref called.\n");
return p;
}
};

int main()
{
C<int> a(5);
a.f<int&>(a.m);
a.f(a.m);
return 0;
}
输出:
const Ref called.
rRef called.
在 gdb 或 Visual Studio 中调试时,两个调试器都显示 int C<int>::f<int &>()在这两种情况下都调用,但显式模板解析解析为预期的 const ref,而第二个解析为右值引用。为什么?为什么编译器甚至不尝试 int C<int>::f<int>()我认为这将是明显的匹配?
右值引用如何绑定(bind)到成员值?不是 a.m左值?

最佳答案

当您调用电话时:

a.f<int&>(a.m);
编译器必须在以下候选者之间进行选择:
template<class U>
T f(U && p); // #1

template<class U>
T f(U const & p); // #2
对于此重载解决过程,首先将两个模板转换为参数 int& .
代入 U = int &对于 #1int & && ,由于引用折叠,变为 int & .
同样,替换 U = int &对于 #2int & const & ,由于引用崩溃,它再次变为 int & .
现在,由于两个重载都匹配,因此使用部分排序来确定要调用哪个模板。现在 U const &U && 更专业.这是因为 U &&可以绑定(bind)到 U const & 的所有类型可以,但反之则不成立。
因此,由于 #2更专业,它在重载决议中获胜,并被调用。

在本次通话中:
a.f(a.m);
未指定模板参数。这意味着 #1的参数被认为是一个转发引用,它匹配所有传入的类型,所以 #1被调用。

关于c++ - 使用模板和右值引用的重载解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64396678/

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