10

次のコードがあります。

#include "stdafx.h"
#include <iostream>
using namespace std;
#include <conio.h>
#include <cstring>
#include <iomanip>

void swap(long a, long b)
{
    long temp;

    temp=a;
    a=b;
    b=temp;
}
int _tmain(int argc, _TCHAR* argv[])
{
    int x = 5, y = 3;
    cout << x ;
    cout << y << endl;

    swap(x, y);

    cout << x ;
    cout << y << endl;

    getch();
    return 0;
}

プログラムの出力は次のとおりです。

5 3

3 5

プログラムは実際に値を交換します! 何故ですか?のパラメーターは、swap()ポインターまたは参照ではありません。

(私はVS 2005を使用しています)

4

2 に答える 2

37

あなたのswap関数はまったく呼び出されていません。

含めた標準ライブラリ インクルードの 1 つは、名前空間で名前が<utility>付けられた関数テンプレートを宣言するプルです。であるため、その関数はグローバル名前空間に取り込まれ、代わりに呼び出されます。swapstdusing namespace std;swap


なぜあなたの機能std::swapの代わりに選ばれるのですか?swap関数swapは 2 つlongの値を受け取ります。intその関数を呼び出すには、引数 ごとに整数昇格が必要です。

std::swap関数テンプレートです。への 2 つの参照が必要Tです。その関数テンプレートが でインスタンス化されるとT = int、両方の引数が完全に一致します。そのstd::swapため、関数よりも一致するため、オーバーロードの解決中に選択されます。


using namespace std;これは悪であり、避けるべき理由の 1 つです。using ディレクティブを削除すると、関数が使用可能な唯一の関数になり、呼び出されます。

于 2011-05-07T05:24:29.227 に答える
1

longの代わりに言ってintください。

あなたの現在のコードは、すでにより適切に に適合しているためswap、 への暗黙的な変換を回避し、代わりに STL からのlong組み込みを使用します。swap

余談ですが、このあいまいさは、言語 D のオーバーロード セット(こちらも) を使用してある程度解決されます。

于 2011-05-07T05:25:19.057 に答える