正如here所解释的那样,不同类别的值根据以下优先顺序绑定到不同类别的引用:
struct s {};
void f ( s&); // #1
void f (const s&); // #2
void f ( s&&); // #3
void f (const s&&); // #4
const s g ();
s x;
const s cx;
f (s ()); // rvalue #3, #4, #2
f (g ()); // const rvalue #4, #2
f (x); // lvalue #1, #2
f (cx); // const lvalue #2
标准中的哪个位置描述了这种偏好顺序?
答案 0 :(得分:2)
<强> [over.ics.rank] / 3 强> - (3.1)标准转换序列
S1
是比标准转换序列S2
更好的转换序列,如果...
(3.1.3) -
S1
和S2
是引用绑定(8.5.3),并且都没有引用没有ref-qualifier声明的非静态成员函数的隐式对象参数,并且S1
将右值引用绑定到右值,S2
绑定左值引用。...
(3.1.6) -
S1
和S2
是引用绑定(8.5.3),引用引用的类型是相同的类型,除了顶级cv限定符,并且S2
引用初始化引用的类型比S1
引用的引用引用的类型更符合cv。
根据这些规则,采用右值引用的函数优于采用左值引用的函数,然后采用非const引用的函数优于采用const的函数。当然,只考虑可行的过载。