考虑到这三个函数,这个调用是模棱两可的。
int f( int );
int f( int && );
int f( int const & );
int q = f( 3 );
移除 f( int )
会导致Clang和GCC都优先选择rvalue引用而不是lvalue引用。但是,移除任何一个引用重载都会导致 f( int )
发生二义性。
通常情况下,重载解析是通过严格部分排序来进行的,但是 int
看起来等价于两个不相互等价的东西。这里有什么规则吗?我似乎记得有一个缺陷报告与此相关。
在未来的标准中,int &&
是否可能优先于 int
?引用必须绑定到初始化程序,而对象类型并没有如此限制。因此,在 T
和 T &&
之间进行重载可以有效地意味着“如果我已经拥有,则使用现有对象,否则进行复制”。(这类似于纯值传递,但节省了移动开销。)由于这些编译器当前的工作方式,这必须通过重载 T const &
和 T &&
并显式复制来完成。但我甚至不确定这是否严格符合标准。
int&&
,但在问题中却泛化为T&&
,尽管它们是不同的。到底是哪一个? - Rapptz