66

鉴于所有三个函数,这个调用是模棱两可的。

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

int q = f( 3 );

删除f( int )会导致 Clang 和 GCC 都更喜欢右值引用而不是左值引用。但是,删除任一引用重载会导致与f( int ).

重载解决通常是按照严格的偏序来完成的,但int似乎等同于两个互不等同的东西。这里有什么规则?我似乎记得有关此的缺陷报告。

在未来的标准中是否有机会int &&被优先考虑?int引用必须绑定到初始化程序,而对象类型不受限制。T因此,在and之间重载T &&可能实际上意味着“如果我已获得所有权,则使用现有对象,否则复制。” (这类似于纯值传递,但节省了移动的开销。)由于这些编译器当前工作,这必须通过重载T const &T &&显式复制来完成。但我什至不确定这是否是严格的标准。

4

1 回答 1

57

这里有什么规则?

由于只有一个参数,因此规则是该参数的三个可行参数初始化之一必须比其他两个更好地匹配。当比较两个初始化时,要么一个比另一个好,要么都不是更好(它们无法区分)。

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

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

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

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

S1 和 S2 是引用绑定 (8.5.3),两者都没有引用声明的非静态成员函数的隐式对象参数,而 S1 将右值引用绑定到右值,S2 绑定左值引用。

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

在未来的标准中,是否有可能 int && 比 int 更受欢迎?引用必须绑定到初始化程序,而对象类型不受限制。因此,在 T 和 T && 之间重载可能实际上意味着“如果我被授予所有权,则使用现有对象,否则复制。”

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

于 2013-07-31T04:54:59.843 回答