提问人:nvn 提问时间:11/8/2023 最后编辑:Toby Speightnvn 更新时间:11/8/2023 访问量:71
当两个模板都等量匹配时,函数绑定到第二个模板而不是通用引用 [duplicate]
function binds to second template instead of universal reference when both equally match [duplicate]
问:
这是一个比特菲德。所以我必须添加 const 如有问题。i
现在它打印 lvalue。
为什么当通用参考是更好的匹配时,它会打印左值 ?
这是否意味着当我们有左值引用匹配和右值引用匹配时 lvalue ref match 总是被选中?
#include<bits/stdc++.h> using namespace std; template<typename T> void f(const T&& obj){ cout <<"rvalue\n"; } template<typename T> void f(const T& obj){ cout <<"lvalue\n"; } struct S { int i:31; int j; }; int main() { S s; f(s.i); }
下面我们从 f(T&& obj) 中删除 const,它将右值打印为 预期,因为两者都是匹配和通用参考 优先权。这是对的吗?
#include<bits/stdc++.h> using namespace std; /* this is not constant . It is T&& instead of const T&& */ template<typename T> void f(T&& obj){ cout <<"rvalue\n"; } template<typename T> void f(const T& obj){ cout <<"lvalue\n"; } struct S { int i:31; int j; }; int main() { S s; f(s.j); }
答:
2赞
463035818_is_not_an_ai
11/8/2023
#1
原因是它不是转发参考(斯科特称之为“通用参考”的官方术语)。来自 cppreference:const T&&
转发引用是一种特殊类型的引用,它保留了函数参数的值类别,从而可以通过 std::forward 转发它。转发引用是:
- 函数模板的函数参数,声明为右值引用,引用同一函数模板的 CV-Unqualified 类型模板参数:[...]
const T&&
不是“CV-unqualified”,因此不是转发参考。在第二个示例中,是一个转发引用。f(T&& obj)
T
评论