関数オブジェクトは、オーバーロード解決時に通常の関数とは異なる扱いをしていますか?もしそうなら、どうですか?関数オブジェクトは過負荷解決にどのように影響しますか?
私は同等に呼び出し可能な関数オブジェクトと機能を交換するには、コードの意味を変更し、次の場合に実行した:
#include <iostream>
namespace N
{
enum E { A, B };
void bar(E mode) { std::cout << "N::bar\n"; }
}
template <typename... Args>
void bar(Args&&... args) { std::cout << "global bar\n"; }
int main()
{
bar(N::A);
}
ここで出力が「N ::バー」です。これまでのところ、N :: barはADLによって検出されています。N :: barとグローバルバーは完全に一致しています。テンプレートではないため、N :: barが優先されます。
しかし、私はそうのように、関数オブジェクトであることを世界的なバーを変更した場合:
#include <iostream>
namespace N
{
enum E { A, B };
void bar(E mode) { std::cout << "N::bar\n"; }
}
struct S
{
template <typename... Args>
void operator()(Args&&... args) { std::cout << "global bar\n"; }
};
S bar;
int main()
{
bar(N::A);
}
出力は今や「世界のバー」です。なぜ違い?
今日、私はDavidに感謝しました。 – ildjarn
私は3.4でノートがないと思います。'bar' *は関数呼び出し式の後置式である(オペランドとしての機能を持たず、最終的には1つを呼び出す!)ため、1/3が関係します。 3.4.2は、 "x(y)"の構文上の意味を変更しないことに注意してください。関数呼び出しの場合、3.4.2で決める関数の呼び出しを無視しています。 –
@ JohannesSchaub-litb:通常の検索では、 'bar'はオブジェクトであり、オブジェクトである' bar(x) 'はそのインスタンスへの' operator() 'のアプリケーションを表します。演算子のアプリケーションは関数呼び出しですが、* member-function *呼び出しであるため、ADLは適用されません。 –