>>847 Uni厨で済みませんでした。無知で恥かしいです。 $cl.exe /G6 /O2 test.c Microsoft(R) 32-bit C/C++ Standard Compiler Version 13.10.3077 for 80x86 Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.
cl : コマンド ライン warning D4029 : 標準の編集コンパイラでは最適化は使用できません。 test.c Microsoft (R) Incremental Linker Version 7.10.3077 Copyright (C) Microsoft Corporation. All rights reserved.
↓は"redefinition of `int call(int (*)(int))'" int call( int x(int) ){ return x(0); } int call( int(*x)(int) ){ return x(0); }
↓はエラー無し template< typename Function > int call( Function x ){ return x(0); } template int call<int(int)>( int(int) ); template int call<int(*)(int)>( int(*)(int) );
8.3.5 -3- より。 "After determining the type of each parameter, any parameter of type ``array of T'' or ``function returning T'' is adjusted to be ``pointer to T'' or ``pointer to function returning T,'' respectively."
14.8.2 -3- によると、 この変換がテンプレートのときにもいちおう関係はするようだが、 Noteとして書かれている "f<int>(1) and f<const int>(1) call distinct functions even though both of the functions called have the same function type." というのが怪しい。 変換後の仮引数がいっしょになるとしても、別々の関数としてコンパイルされるみたい。