![](/img/trans.png)
[英]C++ friend function template overloading and SFINAE different behaviors in clang++, g++, vc++ (C++14 mode)
[英]Print an address of function in C++, g++/clang++ vs vc++ , who is right?
考慮以下簡單程序:
#include <iostream>
void foo() { }
int main() {
std::cout<<static_cast<void*>(foo);
}
它在VC++
上可以正常編譯,但是g++
和clang++
會給出編譯錯誤。
在此處觀看實時演示( VC++
)
在此處觀看現場演示( clang++
)
在此處觀看實時演示( g++
)
由g++
和clang++
提供的診斷信息:
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);
^
因此,問題是根據C ++標准,哪個編譯器在這里? 我認為g++
和clang++
行為在這里是正確的。 我知道我應該在這里使用reinterpret_cast
而不是static_cast
。 這是VC++
編譯器中的錯誤嗎? 如果答案取決於C ++的特定標准,那么我也很好奇。
GCC和Clang是正確的,因為您嘗試執行的轉換不在static_cast
可以執行的轉換之中。 這些轉換在[expr.static.cast]中進行了枚舉。 我將通過參考本節中的段落來簡要總結它們:
此外,p5說:
不得使用
static_cast
明確執行其他任何轉換。
函數或函數指針到void*
的轉換不在列出的轉換中。
特別是,由於沒有從函數指針到void*
標准轉換,因此不適用直接初始化。 根據[conv.ptr] / 2:
可以將類型為“ pointer to cv
T
”(其中T
是對象類型)的prvalue轉換為類型為“ pointer to cvvoid
”的prvalue。 將對象類型的指針的非空指針值轉換為“ cvvoid
指針”的結果表示內存中與原始指針值相同的字節的地址。 空指針值將轉換為目標類型的空指針值。
請注意,這僅覆蓋對象指針,而不覆蓋函數指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.