は、簡単なプログラム、次の点を考慮:それはVC++
に罰金コンパイルが、g++
& clang++
は、コンパイルエラーを与えるC++、g ++/clang ++ vs vC++の関数のアドレスを表示しますか?
#include <iostream>
void foo() { }
int main() {
std::cout<<static_cast<void*>(foo);
}
。
source_file.cpp: In function ‘int main()’:
source_file.cpp:4:38: error: invalid static_cast from type ‘void()’ to type ‘void*’
std::cout<<static_cast<void*>(foo);
^
:
はライブデモhere(VC++
)
を参照してくださいライブデモhere(clang++
)
を参照してくださいライブデモg++
& clang++
で与えhere(g++
)
診断を参照してください。
C++標準によれば、ここでどのコンパイラが正しいのでしょうか?私は、ここではg++
& clang++
の動作が正しいと思います。 static_cast
の代わりにreinterpret_cast
をここで使用する必要があることを知っています。 VC++
コンパイラでこのバグはありますか?答えがC++の特定の標準に依存している場合は、それについても知りたいと思っています。 this pointers-to-void referenceから
fooは関数ポインタに減衰します。 – Destructor
MSVCの正しさを望むなら、最近追加された '/ permissive-'でMSVC14.1を使用してください。また、VC++の代わりにMSVCと呼ばれることもあります。 – tambre