对象,右值引用,const引用之间的重载parsing

给定所有这三个函数,这个调用是不明确的。

int f( int ); int f( int && ); int f( int const & ); int q = f( 3 ); 

除去f( int )会导致Clang和GCC优先于左值引用的右值引用。 但相反,删除任何引用重载都会导致f( int )模糊。

重载parsing通常是用严格的偏序来完成的,但是int似乎相当于两个不相等的东西。 这里的规则是什么? 我似乎记得有关这方面的缺陷报告。

在未来的标准中, int &&可能比intint吗? 引用必须绑定到初始化程序,而对象types不是那么受限制。 因此, TT &&之间的重载可能有效地意味着“如果给予所有权,则使用现有对象,否则复制”。 (这与纯传值类似,但是节省了移动的开销)。由于这些编译器当前正在工作,所以这必须通过重载T const &T && ,并明确复制来完成。 但我甚至不确定这是否是严格的标准。

这里的规则是什么?

由于只有一个参数,所以规则是该参数的三个可行参数初始化中的一个必须比另外两个参数更好地匹配 。 当比较两个初始化时,任何一个都比另一个更好,或者两者都不是更好(它们是不可区分的)。

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

有关直接引用绑定的特殊规则使得int&&const int&更好,但是它们都不比int好或者差。 因此没有最佳匹配:

 S1 S2 int int&& indistinguishable int const int& indistinguishable int&& const int& S1 better 

int&&const int&更好const int&因为13.3.3.2:

S1和S2是引用绑定(8.5.3),既没有引用ref-qualifier也没有引用非静态成员函数的隐式对象参数,S1将右值引用绑定到右值,S2绑定了左值引用。

但是这个规则不适用于其中一个初始化不是参考绑定。

在未来的标准中,int &&有可能比int更受欢迎吗? 引用必须绑定到初始化程序,而对象types不是那么受限制。 因此,T与T之间的重载可能有效地意味着“如果给予所有权,则使用现有对象,否则复制”。

您build议将引用绑定比非引用绑定更好匹配。 为什么不把你的想法发布到isocpp未来的build议 。 SO不是主观讨论/意见的最佳select。