2

fコンパイラがfunction の代わりに以下の functor を呼び出すことを決定するルールを誰か説明してもらえますかf?

#include <iostream>

struct A {
    void operator()() { std::cout << "functor" << std::endl; }
};

void f() { std::cout << "function" << std::endl; }

int main()  
{
    A f;
    f();  // Output: functor
}

A::operator()()オーバーロードでf()はないので、これはオーバーロード解決の外で発生すると思います。

4

1 に答える 1

5

それは名前の隠蔽によるものです。f変数を宣言すると、f関数が非表示になります。そのスコープで名前fを使用すると、関数ではなくローカル変数が参照されます。

関数を呼び出したい場合は、スコープ解決演算子fを使用できます。

#include <iostream>

struct A {
    void operator()() { std::cout << "functor" << std::endl; }
};

void f() { std::cout << "function" << std::endl; }

int main()  
{
    A f;
    ::f();  // Output: function
}
于 2013-10-21T01:15:34.957 に答える