3
void g(int& a)
{
    std::cout<<"int&\n";
} 

void g(int a)
{
    std::cout<<"int\n";
}  

int main()
{    
    int a = 2;   
    g(a); //won't compile (at least under MSVC 2012)

    std::cin.ignore();
}

ここであいまいな呼び出しエラーを回避する方法はありますか?何かのようなものg( static_cast<int&>(a) );

4

3 に答える 3

10

キャストできる場合は、もちろん、呼び出しを明確にする方法があります。

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

参照バージョンを呼び出すことを主張する場合、解決はもう少しトリッキーです:

static_cast<void(*)(int&)>(g)(a);
于 2012-11-13T20:50:05.713 に答える
3

オーバーロードを解決するために、正しいタイプの参照へのバインドは、正しいタイプの非参照へのバインドとまったく同じように完全に一致するため、2つのオーバーロードは左辺値int引数に関して同じ優先順位を持ちます。

2番目のオーバーロードにをとらせることができint const &ます。その場合、まったく同じ方法で使用できますが、明確なオーバーロードになります。

または、関数の型をキャストすることで、過負荷の解決を完全に回避できます。

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

ただし、あいまいさがある場合(つまり、左辺値を渡す場合)、関数を呼び出すたびにこれを行う必要がありintます。

このビデオはあなたにとって必須の視聴です。

于 2012-11-13T20:45:24.587 に答える
3

この答えは、私が答えたときの質問に関連しています。

OPは質問に追加し続けます、そして私はそれを追いかけるつもりはありません…


はい、あります。はい、あいまいさを解決するためにキャストする必要があるのは正しいです。

#include <iostream>

void g(int& a)
{
    std::cout<<"int&\n";
} 

void g(int a)
{
    std::cout<<"int\n";
}  

int main()
{    
    int a = 2;   
    static_cast< void(*)(int&) >( g )( a );
}

注:これをVisual Studioで実行して結果ウィンドウを表示するには、[Ctrl F5]を使用するか、の最後の右中括弧にブレークポイントを設定しmainてデバッガーで実行します。ただし、コマンドラインから実行する方がよいでしょう。最後に「ストップ」を追加する必要はありません!:-)


修正Dietmarは、キャストを使用してconst値による引数のオーバーロードを呼び出す方法を回答で示しました。私はそれについても考えていませんでしたが、それを実行したい場合は(参照バージョンを考慮から除外することに限定されています)、のconst_cast代わりにを使用してくださいstatic_cast

または、引数から右辺値式を作成するだけです。たとえば、前に便利な小さな+記号を追加します。

    g( +a );

:-)

于 2012-11-13T20:49:20.360 に答える