9

以下のC++コードでfoobarは、最初に単一のdoubleパラメーターに対して定義され、次にタイプがの単一のパラメーターに対して定義されていますFoo。どちらもグローバル名前空間内で定義されます。

one名前空間内で、foobarタイプの単一のパラメーターを使用して、のさらなるオーバーロードが定義されますBar。このバージョンのから、引数(42.0)を使用したfoobarへの修飾されていない呼び出しは失敗します。今回は(::)スコープ解決演算子で修飾され、引数も指定された、への同様の呼び出しは成功します。foobardoublefoobardouble

一方、foobar型の引数を持つ、への修飾されていない呼び出しFooは成功します。スコープ解決演算子によって修飾されfoobarた引数付きのへの呼び出しも成功します。Foo

2つのシナリオの動作が異なるのはなぜですか?私はgcc4.7とclang++3.2の両方を使用しています。

struct Foo {};
struct Bar {};

double foobar(double x) { return x; }
Foo    foobar(Foo f)    { return f; }

namespace one {

  Bar foobar(Bar b) {
    //foobar(42.0); // error: can't convert to Bar
    ::foobar(42.0);

    Foo f;
      foobar(f);    // no problem
    ::foobar(f);
    return b;
  }
};
4

1 に答える 1

8

引数に依存するルックアップ

呼び出しfoobar(f)では、の名前空間からの関数Fooが考慮されます。

doubleそのタイプはどの名前空間でも宣言されていないため、は機能しません。

于 2012-08-08T22:03:36.717 に答える