【发布时间】:2020-08-05 20:28:49
【问题描述】:
如果我们有:
void foo(int) {}
void foo(const int&) {}
我们不能像这样调用foo:
foo(3);
因为调用不明确:
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&) {} | ^~~
我们可以做的是显式提供正确的重载,例如通过函数指针:
auto (*ptr)(const int&) -> void = foo;
ptr(3); // calls the "const int&" overload, obviously
但是,这违背了方便重载的目的。问题是 - 我能以某种方式消除通话歧义吗? 优雅? 方式?是否存在曾经需要为T和const T&提供两种重载的情况?
【问题讨论】:
-
使用函数指针将是最干净的解决方案。您可以对
foo本身进行类型转换,这可行,但可读性不强:static_cast<void (*)(const int&)>(foo)(3); -
@RemyLebeau 谢谢。然而,我对问题的最后一部分更感兴趣——很抱歉没有足够好地强调这一点。但是在阅读了您的评论后,我开始相信没有理由同时为
T&和const T&提供重载,对吗? -
“是否存在需要同时为 T 和 const T& 提供重载的情况?” - 你知道,我正要问 你那个。因为我还没有遇到需要出现的情况。
-
不管这个有没有真正的用例,我还是想知道答案。
-
@StoryTeller-UnslanderMonica 这个问题纯粹是学术性的——我觉得仅凭我的意见并不能成为一个足够的答案,因为直到一个小时前我才研究过这个话题。我没有找到任何表明它需要的东西,所以我想与 SO 专家确认这一点。你的怀疑,如果我可以这样称呼的话,是绝对正确的。