1

正如这里所解释,不同类别的值根据以下优先顺序绑定到不同类型的引用:

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

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

4

1 回答 1

3

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

...

(3.1.3) —S1并且S2是引用绑定 (8.5.3),既不引用未声明的非静态成员函数的隐式对象参数 ref 限定符,也S1将右值引用绑定到右值并S2绑定左值引用.

...

(3.1.6) —S1并且S2是引用绑定 (8.5.3),并且引用所引用的类型除了顶级 cv 限定符之外是相同的类型,并且引用所初始化的类型S2是更多的 cv - 比由其初始化的引用所引用的类型限定S1

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

于 2017-09-08T04:11:47.700 回答