C++ 对重载函数-int和int的调用不明确&

C++ 对重载函数-int和int的调用不明确&,c++,reference,overloading,C++,Reference,Overloading,这里有没有办法避免不明确的调用错误?有点像g_casta 为了重载解析,绑定到正确类型的引用是完全匹配的,就像绑定到正确类型的非引用一样,因此两个重载对于左值int参数具有相同的优先级 您可以使第二个重载采用int常量&,在这种情况下,它可以以完全相同的方式使用,但将是一个独特的重载 或者,您可以通过强制转换函数类型来完全避免重载解析: 对于存在歧义的函数的每次调用,您都必须这样做,尽管是在传递左值int时 这段视频是给你的。这个答案与我回答时的问题有关 OP一直在增加这个问题,我不想再追问了

这里有没有办法避免不明确的调用错误?有点像g_casta

为了重载解析,绑定到正确类型的引用是完全匹配的,就像绑定到正确类型的非引用一样,因此两个重载对于左值int参数具有相同的优先级

您可以使第二个重载采用int常量&,在这种情况下,它可以以完全相同的方式使用,但将是一个独特的重载

或者,您可以通过强制转换函数类型来完全避免重载解析:

对于存在歧义的函数的每次调用,您都必须这样做,尽管是在传递左值int时

这段视频是给你的。

这个答案与我回答时的问题有关

OP一直在增加这个问题,我不想再追问了

是的,是的,你是对的,它涉及到解决模棱两可的问题:

static_cast<void(&)(int)>(g)(a);
static_cast<void(&)(int&)>(g)(a);

:-

如果你能投,当然有一种方法可以消除呼叫的歧义:

    g( +a );
如果您坚持调用参考版本,则解决方案会有点棘手:

g(const_cast<int const&>(a));

你想让它叫哪一个;我原以为gint&a会被称为这是真的,像这样禁用重载解析是可行的,但这并不理想。在这样的左值上调用裸函数是不可能的……kerrek,我无法理解你的评论。它认为这意味着它毫无意义。例如,这很难达到理想状态,那么为什么要向我而不是向OP发表评论,OP要求这样做。或者为什么不自己做呢,因为我给你看的时候你添加了这个解决方案。天哪。@downvoter kerrek,是你吗?请解释你的downvote,让人们更容易看到你是谁。不是我,当然不是-我基本上是复制了你的答案,使我的答案完整-有什么不高兴的?我发表评论是为了让OP能够发现,虽然他的问题有直接的答案,但生成的代码不会很好。您的答案在技术上仍然不正确,因此我保留否决票。两个重载始终具有相同的优先级,这与前面的参数不同,因为它们并不总是具有正确的wrt类型。到实际参数,特别是对于常量或右值参数。特别是,dietmar的答案显示了一种纯粹通过实际参数的类型选择by value函数的方法,而我的答案显示了另一种纯粹通过实际参数表达式的右值选择by value参数的方法。顺便说一句,我觉得我的答案更可爱。这肯定是最短、最清晰的函数调用:-@cheers-sandhth。-阿尔夫:哦,当然,我现在看到了。int重载当然可以在更一般的情况下工作。我会重新措辞的。+1对于演员到康斯特,我甚至没想到!,但是-1表示使用静态_cast而不是常量_cast,总之是0-@干杯。-阿尔夫:好的观点:我会修正答案,使用正确的演员阵容!静态_castga;:你必须爱上一种简单的C++语言:+1AHH,令人兴奋的,然后Stista Stua也应该工作,非,是的,int。如果类型不是int,但例如std::string,则此用法将移动对象,而对象可能不完全是您想要的。
    g( +a );
g(const_cast<int const&>(a));
static_cast<void(*)(int&)>(g)(a);