这里
i
是一个bitfied。所以我必须添加 const as
有问题 .
现在它打印左值。
为什么当通用引用更匹配时它会打印左值 ?
这是否意味着我们有左值引用匹配和右值引用匹配 左值引用匹配总是被选择?
#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);
}
原因是
const T&&
不是转发参考(Scott 所说的“通用参考”的官方术语)。来自cppreference:
转发引用是一种特殊的引用,它保留函数参数的值类别,从而可以通过 std::forward 转发它。转发参考是:
const T&&
不是“简历不合格”,因此不是转发参考。在第二个示例中 f(T&& obj)
T
是转发参考。