は、次のコードを考えてみましょう:明示的な&on関数名なしで、関数ポインタをテンプレート関数と比較できないのはなぜですか?
void func(int) {}
template<typename T> void templatedFunc(T) {}
int main()
{
void (*p)(int) = func;
bool test1 = p==func;
//bool test2 = p==templatedFunc<int>; // compilation error
bool test3 = p==&templatedFunc<int>; // but this works
}
あなたがtest2
行のコメントを解除し、G ++でコードをコンパイルしようとすると、次のエラー得られます:
test.cpp: In function ‘int main()’:
test.cpp:8:21: error: assuming cast to type ‘void (*)(int)’ from overloaded function [-fpermissive]
bool test2 = p==templatedFunc<int>; // compilation error
^~~~~~~~~~~~~~~~~~
を私はグラムで、この結果を得る++ 5.3.0および6.2.0。同時に、clang ++ 3.6.0によるコンパイルは警告なしで成功します。
ここで標準的なコンパイラは正しいですか?g ++はエラーを出しますか?clang ++はありませんか?
g ++が正しければ、明示的なアドレス演算子の必要性に関して、通常の関数とテンプレート関数のような非対称があるのはなぜですか?
完全に特殊化された関数テンプレート(またはインスタンス化)が通常の関数とみなされ、そのように動作する必要があるため、私の常識はこの状況で正しいと言います。 – DeiDei
'void(* p)(int)= templatedFunc;'を実行できるかどうか、 '&'も必要ですか? –
TripeHound
ところで、慣習的なやり方は '&'を使うことです。 – Jarod42