前幾天在探究虛擬函式的時候, 想要把函式的位址顯示出來, 於是就遇到了靈異現象, 以底下的程式碼為例:
#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)