您可以(并且应该)消除使用 T 和 const 引用 T 的函数调用的歧义吗?

Fur*_*ish 6 c++ overload-resolution

如果我们有:

void foo(int) {}
void foo(const int&) {}
Run Code Online (Sandbox Code Playgroud)

我们不能这样调用foo

foo(3);
Run Code Online (Sandbox Code Playgroud)

因为调用是模棱两可的:

error: call of overloaded 'foo(int)' is ambiguous
40 |     foo(3);
   |          ^
note: candidate: 'void foo(int)'
36 | void foo(int) {}
   |      ^~~
note: candidate: 'void foo(const int&)'
37 | void foo(const int&) {}
   |      ^~~
Run Code Online (Sandbox Code Playgroud)

我们可以做的是明确提供正确的重载,例如通过函数指针:

auto (*ptr)(const int&) -> void = foo;
ptr(3); // calls the "const int&" overload, obviously
Run Code Online (Sandbox Code Playgroud)

然而,这种方式违背了方便重载的目的。问题是 - 我可以以某种方式以更......优雅的方式消除呼叫的歧义吗?道路?是否有哪里会需要提供案件过载,为Tconst T&

Bri*_*ian 1

您似乎在问我们是否可以强制重载解析机制选择一个签名而不是另一个签名,而不是明确地拼写出您想要的签名。

据我所知,强制重载解析选择重载而不是重载的唯一方法intconst int&将参数转换为左volatile int值,并且没有办法强制重载解析选择const int&重载而不是int重载。

无论如何,我想不出为什么有人想要编写这组特定的重载。