【问题标题】:Overload resolution between object, rvalue reference, const reference对象、右值引用、常量引用之间的重载解析
【发布时间】:2013-07-31 11:12:55
【问题描述】:

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

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 && 并显式复制来完成。但我什至不确定这是否是严格标准。

【问题讨论】:

  • 您在代码中声明int&&,然后在问题中概括为T&&,尽管它们有所不同。是哪个?
  • @Rapptz 我只说T 在谈论实际使用中的可能含义时。我并不是要建议完美的转发,那是完全不同的球赛。

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


【解决方案1】:

这里有什么规则?

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

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

关于直接引用绑定的特殊规则使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),两者都没有引用非静态成员函数的隐式对象参数,声明时没有 ref-qualifier,S1 将右值引用绑定到右值,S2 绑定左值参考。

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

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

您建议使引用绑定比非引用绑定更匹配。为什么不将您的想法发布到isocpp future proposals。 SO 不适合主观讨论/意见。

【讨论】:

  • 所以 gcc 和 clang 都是正确的:如果考虑到 f(int)f(int&&),则过载是不明确的,f(int)f(int const&) 也是如此。
  • @Yakk:"如果考虑 f(int) 和 f(int&&),则重载不明确" 差不多。如果没有最佳匹配,则过载是不明确的。假设f(int)f(int&&)f(double) 对于f(2.0) 的调用是可行的。 f(double) 是最佳匹配,即使考虑了 f(int)f(int&&)
猜你喜欢
  • 1970-01-01
  • 2013-08-01
  • 2016-04-20
  • 2019-02-05
  • 2017-03-26
  • 1970-01-01
  • 2011-12-06
相关资源
最近更新 更多