テンプレートはブロック内に表示できないことを理解していextern "C"
ます。その理由は、インスタンス化されたテンプレート関数の名前が、マングルされていない名前を使用して 1 回しか表示されないためです。
ただし、以下のコードでは、関数の名前がマングルされています (インスタンス化ごとに一意の名前が付けられるため、問題はないはずです) が、C 言語リンケージを持つ関数型はまだあります。私の質問は、以下のコードが適切に形成されているかどうかです。
extern "C" using fn_type = void();
template<typename T>
fn_type foo;
int main()
{
fn_type* const p = foo<int>;
p();
}
編集: GCC、Clang、および MSVC は C++ と C 関数ポインターの型を区別しないため、コンパイラーを介して実行するだけでは、これが準拠しているかどうかをテストするのは困難です。