对象,右值引用,const引用之间的重载分辨率

Pot*_*ter 58 c++ overloading rvalue-reference c++11 c++14

鉴于所有这三个函数,这个调用是不明确的.

int f( int );
int f( int && );
int f( int const & );

int q = f( 3 );
Run Code Online (Sandbox Code Playgroud)

删除f( int )导致Clang和GCC更喜欢左值引用而不是左值引用.但是,删除任一引用过载都会导致模糊不清f( int ).

过载分辨率通常是根据严格的部分排序来完成的,但int似乎相当于两个彼此不相等的东西.这里的规则是什么?我似乎记得有关此问题的缺陷报告.

在未来的标准中是否有int &&可能优先考虑int?引用必须绑定到初始化程序,而对象类型不受约束.因此,在我之间超载T并且T &&可以有效地表示"如果我已获得所有权,则使用现有对象,否则复制".(这类似于纯通的价值,但移动节省的开销).由于这些编译器目前的工作,这必须通过重载来完成T const &T &&,并明确复制.但我甚至不确定这是严格的标准.

And*_*zos 46

这里的规则是什么?

由于只有一个参数,该规则是,参数的3个可行的参数初始化之一必须是一个更好的匹配两个其他两个.当比较两个初始化时,任何一个比另一个更好,或者两者都不是更好(它们是无法区分的).

如果没有关于直接引用绑定的特殊规则,所提到的所有三个初始化都是无法区分的(在所有三个比较中).

关于直接引用绑定的特殊规则int&&比使用const int&更好或更差int.因此没有最佳匹配:

S1    S2
int   int&&         indistinguishable
int   const int&    indistinguishable
int&& const int&    S1 better
Run Code Online (Sandbox Code Playgroud)

int&&const int&13.3.3.2 更好:

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

但是,当其中一个初始化不是引用绑定时,此规则不适用.

在将来的标准中,int &&是否有可能优于int?引用必须绑定到初始化程序,而对象类型不受约束.因此,T和T &&之间的重载可能有效地意味着"如果我获得了所有权,则使用现有对象,否则复制."

您建议使引用绑定比非引用绑定更好地匹配.为什么不将您的想法发布到isocpp未来的提案.SO不是主观讨论/意见的最佳选择.

  • @Yakk:_"如果考虑f(int)和f(int &&),则重载是不明确的"_几乎.如果没有最佳匹配,则重载是不明确的.假设`f(int)`,`f(int &&)`和`f(double)`对于调用`f(2.0)`是可行的.`f(double)`是最好的匹配,即使考虑了`f(int)`和`f(int &&)`. (4认同)