标准在哪里定义了值与引用绑定的首选顺序?

时间:2017-09-08 04:05:24

标签: c++ c++11 reference language-lawyer value-categories

正如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

标准中的哪个位置描述了这种偏好顺序?

1 个答案:

答案 0 :(得分:2)

  

<强> [over.ics.rank] / 3    - (3.1)标准转换序列S1是比标准转换序列S2更好的转换序列,如果

     

...

     

(3.1.3) - S1S2是引用绑定(8.5.3),并且都没有引用没有ref-qualifier声明的非静态成员函数的隐式对象参数,并且S1将右值引用绑定到右值,S2绑定左值引用。

     

...

     

(3.1.6) - S1S2是引用绑定(8.5.3),引用引用的类型是相同的类型,除了顶级cv限定符,并且S2引用初始化引用的类型比S1引用的引用引用的类型更符合cv。

根据这些规则,采用右值引用的函数优于采用左值引用的函数,然后采用非const引用的函数优于采用const的函数。当然,只考虑可行的过载。