[英]Why does explicitly calling operator<< on std::cout cause unexpected output?
我只是好奇如果我明確地在std::cout
上調用operator<<
會發生什么會因為我了解到a.operator()
與a()
完全相同。 所以我這樣做,它打印出一些奇怪的東西:
#include <iostream>
using std::cout;
int main()
{
cout.operator<<("Hello World");
}
Output: 0x80486a0
奇怪的是,它輸出一個地址(地址可能不同,但它應該仍然是一個地址)。 我認為這是字符串的地址所以我嘗試解除引用它以使其輸出字符串:
*( cout.operator<<("Hello World") );
但是我得到了很長的錯誤
no match for operator* in '*std::cout.std::basic_ostream<...
我覺得這很奇怪。 沒有任何std::cout
定義會讓我相信這會導致任何不同的行為; 另外,明確調用運算符函數沒有區別(或至少應該 )。
那么為什么我得到這個輸出? 為什么在顯式調用運算符時我收到的是地址而不是字符串本身? 這甚至是內存中的地址還是垃圾輸出? 任何回復都表示贊賞。
內置字符串的輸出運算符,即以char const*
作為參數的on,不是std::ostream
的成員。 使用char const*
的運算符是非成員函數,將被稱為
operator<< (std::cout, "Hello World");
但是,有一個成員采用void const*
,它使用十六進制表示法格式化指針的值。 將任何指針顯式傳遞給std::ostream
的成員operator<< ()
,此成員是最佳匹配。
取消引用operator<<()
的結果不起作用:運算符返回一個std::ostream&
它沒有一元運算operator*()
重載。 如果您打算取消引用該參數,您可以這樣稱呼它:
std:cout.operator<< (*"Hello World");
但是,這只會將char const*
字符串字面值衰減,從而產生一個單獨的字符H
字符輸出函數也不是成員函數,而整數的輸出運算符是,即它將打印H
字符值。 對於使用ASCII的系統,它將是72
。
我認為這里的問題是將C樣式字符串打印到輸出流的operator <<
實際上是一個自由函數 ,而不是basic_ostream
的成員函數。 但是, basic_ostream
確實有一個operator<<
函數,它接收一個void*
並打印出它的地址。 因此,如果您顯式嘗試調用operator<<
作為成員函數,則調用打印出C樣式字符串地址的版本,而不是將字符串打印出字符串的自由函數。
你可以通過電話看到這個
operator<< (std::cout, "Hello, world!");
這實際上不打印字符串。
希望這可以幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.