回答
iostreams會將大部分指針指向void *
進行顯示 - 但是對於volatile
指針不存在任何轉換。因爲這樣的C++可以回溯到隱含的轉換爲bool
。投射到void*
明確,如果你要打印的地址:
std::cout << (void*)&clock;
我認爲轉換工作是自動的? –
是的,有一個自動轉換。它只是自動轉換爲'bool',而不是'void *',因爲C++沒有自動轉換爲void *指針(C是,但C++需要顯式轉換) – bdonlan
哦!約翰尼斯也是人類! –
有用於const void*
的operator<<
,但沒有operator<<
爲volatile void*
,並且隱式轉換不會刪除volatile
(它不會刪除const
要麼)。
正如GMan所說,指出的類型的簡歷資格應該與打印地址的業務無關。也許27.7.3.6.2中定義的超載應該是operator<<(const volatile void* val);
,我不能馬上看到任何缺點。但事實並非如此。
#include <iostream>
void foo(const void *a) {
std::cout << "pointer\n";
}
void foo(bool a) {
std::cout << "bool\n";
}
int main() {
volatile int x;
foo(&x);
std::cout << &x << "\n";
int y;
foo(&y);
std::cout << &y << "\n";
void foo(volatile void*);
foo(&x);
}
void foo(volatile void *a) {
std::cout << "now it's a pointer\n";
}
輸出:
bool
1
pointer
0x22cd28
now it's a pointer
擊敗我的一秒鐘,urg :(。補充:在bdonlan提出的解決方案中,將c風格轉換爲const_cast。爲了印刷的目的,這不是真正的問題。 – GManNickG
這是因爲存在用於operator <<
沒有過載,需要一個指針volatile
,並且不存在指針轉換可能滿足它。
根據C++標準,
任何類型
T
,指針T
,指針const T
,和指針volatile T
被認爲是不同的參數類型,因爲是參考T
,參照const T
,和參考到volatile T
。
Operator <<
has no overload for pointers to non-static member,指針到易失性或功能指針,所以試圖輸出這樣的對象調用的隱式轉換到bool
。
- 1. 爲什麼變量的地址變小?
- 2. 爲什麼這個變量是在
- 3. 爲什麼堆的數量總是1?
- 4. 爲什麼'這'不易變?
- 5. 什麼是IP地址':: 1'?
- 6. 爲什麼這些變量的地址打印爲ab @和b @?
- 7. 爲什麼這個變量總是返回true?
- 8. 爲什麼這個循環變量總是0?
- 9. 這是什麼意思?將變量的地址轉換爲char。怎麼來的?
- 10. C#IP地址總是:: 1
- 11. 爲什麼我的元素變量在這個foreach循環中總是爲空?
- 12. 爲什麼hasLayout總是-1?
- 13. 程序中變量的基地址/靜態地址是什麼?
- 14. 爲什麼這個地址在gdb中改變?
- 15. 爲什麼變量_count總是返回-1?
- 16. 爲什麼這個變量消失在一個結構中?
- 17. 爲什麼這個數組和連接總是N-1?
- 18. 爲什麼這個xts頻率總是1?
- 19. 爲什麼這個投票/帖子比例總是1?
- 20. 這個計數爲什麼總是返回1?
- 21. 這是什麼意思批處理變量=%變量:〜1%
- 22. 爲什麼總是這樣?
- 23. 爲什麼變量=變量+1工作?
- 24. 易失變量
- 25. 變量的這兩個點是什麼?
- 26. 爲什麼這個DateTime解析總是失敗?
- 27. 爲什麼我的環回地址是:: 1而不是127.0.0.1?
- 28. 爲什麼總是等級是1?
- 29. 爲什麼數組變量地址和第一個元素地址相等?
- 30. 爲什麼solrnet的網址總是?
* 1 *不一定總是表示數值 - 也可能是合乎邏輯的。 – Kris