检查转换函数的可行性

mad*_*ada 5 c++ overload-resolution

我有以下代码:

struct S {
  operator int();       // F1
   operator double();   // F2
};

int main() {
    int res = S();
}
Run Code Online (Sandbox Code Playgroud)

由于 和F1都不F2是 cv 限定的,因此隐式对象参数的类型是S&,要匹配的相应参数是S()

现在,根据[over.match.viable]/4:(强调我的

第三,为了使 F 成为一个可行的函数,每个参数都应该存在一个隐式转换序列,将该参数转换为 F 的相应参数。如果参数具有引用类型,则隐式转换序列包括绑定引用的操作,事实上,对非 const 的左值引用不能绑定到右值,并且右值引用不能绑定到左值,这可能会影响函数的可行性(请参阅 [over.ics.ref])。

根据上面的引用(粗体),我期望 和F1F2不可行,因为两者的隐式对象参数都是类型,S&并且它不能绑定到右值S()

但是,当我尝试编译代码时,我发现这两个函数都是可行的候选函数。哪个是最佳匹配不是我在这里要问的。

那么,为什么 和 都是F1可行F2的候选者,即使隐式对象参数(类型为S&)无法绑定到类纯右值S()

Adr*_*ica 4

您的问题中表达的主要问题似乎是给定的 右值参数如何绑定到隐式声明的 左值引用参数。(我什至不打算对您的问题评论中关于代码示例中是否涉及任何实际重载的广泛讨论做出裁决。)

\n

这个(主要)问题在您引用的C++ 标准的[over.match.funcs]部分的另一部分中非常清楚地解决了 \xe2\x80\x93 ,恕我直言 \xe2\x80\x93 (粗体强调我的):

\n
\n

12.2.2.1 \xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 常规[over.match.funcs.general]

\n

\xe2\x80\xa6
\n 5 \xc2\xa0\xc2\xa0\xc2\xa0 在重载解析期间,隐含的\n对象参数与​​其他参数无法区分。然而,隐式对象参数保留其标识,因为无法应用用户定义的转换来实现与其的类型匹配。对于\n不使用 ref 限定符声明的隐式对象成员函数,\n即使隐式对象参数不是 const 限定的,\n只要在所有其他方面\n参数可以转换为隐式对象\n参数的类型。

\n
\n

如果没有这一段,隐式转换函数将失去很大的用处,例如您在示例中提供的用例。

\n