Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对重载函数的调用不明确-int和int&; void g(int&a) { std::cout_C++_Reference_Overloading - Fatal编程技术网

C++ 对重载函数的调用不明确-int和int&; void g(int&a) { std::cout

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

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

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

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

static_cast(g)(a);
静态铸造(g)(a);
但是,对于存在歧义的函数的每次调用(即,在传递左值
int
时),都必须这样做

这段视频是给你的。

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

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


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

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

:-)

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

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

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

您希望它调用哪一个?使用
g(static_cast(a));
我期望
g(int&a)
be called确实,禁用这样的重载解析是可行的,但这并不理想。永远不可能对这样的左值调用裸函数……kerrek,我无法理解你的评论。它认为这意味着它毫无意义。例如,它几乎不“理想”,那么,为什么要向我而不是向OP发表评论,OP要求这样做。或者为什么不向你自己发表评论,因为我向你展示时你添加了这个解决方案。天哪。@downvoter(kerrek,是你吗?),请解释你的否决票,以便人们更容易看到你是谁。不是我,当然不是——我基本上是复制了你的答案,以使我的答案完整;-)有什么不安?我发表了评论,以便OP可以发现,虽然他的问题有一个直接的答案,但生成的代码不会很好。你的答案仍然是技术性的lly不正确,因此我保留向下投票。“两个重载始终具有相同的优先级”与前面的参数不同,因为它们并不总是具有“正确的类型”对于实际参数,特别是对于
const
或右值参数。特别是,dietmar的答案显示了一种纯粹通过实际参数的类型选择by value函数的方法,而我的答案显示了另一种纯粹通过实际参数表达式的右值选择by value参数的方法。我认为我的答案非常简单呃,顺便说一句。这当然是最短、最清晰的函数调用:-)@cheers-sandhth.-Alf:Ohh,当然,我现在看到了。在更一般的情况下,
int
重载当然可以工作。我会重新措辞。+1用于将强制转换为
const
(我甚至没有想到!)-但1使用的是<代码> STATICECAST 而不是<代码> COSTOSTCAST ,总之,0。;(阿尔夫):好点:我将修正答案使用正确的Case. <代码> StasyType(G)(A);<代码> >:你必须爱一种简单如C++的语言:(+ 1)AHH,激发-然后<代码> STATICE-CAST(A)也应该工作,非?是,对于
int
它会工作。如果类型不是
int
,但是,例如
std::string
,此使用将移动对象,这可能不完全是您想要的。
    g( +a );
g(const_cast<int const&>(a));
static_cast<void(*)(int&)>(g)(a);