【发布时间】: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 更受欢迎?引用必须绑定到初始化程序,而对象类型不受限制。因此,T 和 T && 之间的重载可能实际上意味着“如果我已获得所有权,则使用现有对象,否则进行复制”。 (这类似于纯值传递,但节省了移动的开销。)由于这些编译器当前工作,这必须通过重载 T const & 和 T && 并显式复制来完成。但我什至不确定这是否是严格标准。
【问题讨论】:
-
您在代码中声明
int&&,然后在问题中概括为T&&,尽管它们有所不同。是哪个? -
@Rapptz 我只说
T在谈论实际使用中的可能含义时。我并不是要建议完美的转发,那是完全不同的球赛。
标签: c++ c++11 overloading rvalue-reference c++14