鉴于所有三个函数,这个调用是模棱两可的。
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 &&
显式复制来完成。但我什至不确定这是否是严格的标准。