前幾天在探究虛擬函式的時候, 想要把函式的位址顯示出來, 於是就遇到了靈異現象, 以底下的程式碼為例:
#include <iostream>
using namespace std;
void foo() {
cout << "foo()" << endl;
}
int main(void)
{
cout << foo << endl;
}
卻得到以下的輸出:
1
研究了一下才發現, 雖然 cout
所屬的類別 std::basic_ostream
有以下的 <<
運算子多載版本:
basic_ostream& operator<<( const void* value );
basic_ostream& operator<<( const volatile void* value );
不過指向特定型別的指位器並不能自動轉型成 (void*)
, 但是卻可以自動轉型到 bool
, 因此編譯器會選用以下這個版本:
basic_ostream& operator<<( bool value );
它會用 1 和 0 表示 true
和 false
, 所以不是指向 null
的指位器就被轉成 true
, 印出 1 了。
如果要印出位址, 就必須先手動把指位器轉型成 (void*)
, 像是這樣:
#include <iostream>
using namespace std;
void foo() {
cout << "foo()" << endl;
}
int main(void)
{
cout << (void*)foo << endl;
}
才會印出位址:
0x7ff78d461540
Top comments (0)