gpt4 book ai didi

c++ - 对象、右值引用、常量引用之间的重载解析

转载 作者:IT老高 更新时间:2023-10-28 13:23:23 25 4
gpt4 key购买 nike

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

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

int q = f( 3 );

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

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

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

最佳答案

What are the rules here?

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

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

关于直接引用绑定(bind)的特殊规则使 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 and S2 are reference bindings (8.5.3) and neither refers to an implicit object parameter of a non-static member function declared without a ref-qualifier, and S1 binds an rvalue reference to an rvalue and S2 binds an lvalue reference.

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

Is there any chance int && may be preferred over int in a future standard? The reference must bind to an initializer, whereas the object type is not so constrained. So overloading between T and T && could effectively mean "use the existing object if I've been given ownership, otherwise make a copy."

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

关于c++ - 对象、右值引用、常量引用之间的重载解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17961719/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com