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

时间:2013-07-31 04:38:06

标签: c++ c++11 overloading rvalue-reference c++14

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

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

int q = f( 3 );

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

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

在未来的标准中,int &&是否有可能比int更受欢迎?引用必须绑定到初始化程序,而对象类型不受约束。因此,TT &&之间的重载可能实际上意味着“如果我获得了所有权,则使用现有对象,否则复制。” (这类似于纯值传递,但节省了移动的开销。)由于这些编译器目前有效,因此必须通过重载T const &T &&并明确复制来完成。但我甚至不确定这是严格的标准。

1 个答案:

答案 0 :(得分:45)

  

这里的规则是什么?

由于只有一个参数,规则是该参数的三个可行参数初始化中的一个必须更好匹配 其他两个。比较两个初始化时,其中一个比另一个更好,或者两者都没有更好(它们无法区分)。

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

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

S1    S2
int   int&&         indistinguishable
int   const int&    indistinguishable
int&& const int&    S1 better
由于13.3.3.2:

int&&优于const int&

  

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

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

  

有没有机会int&&在未来的标准中可能优于int吗?引用必须绑定到初始化程序,而对象类型不受约束。所以在T和T&& amp;之间超载可以有效地表示“如果我已获得所有权,则使用现有对象,否则复制。”

您建议使引用绑定比非引用绑定更好地匹配。为什么不将您的想法发布到isocpp future proposals。因此,主观讨论/意见不是最好的。