簡體   English   中英

為什么在std :: cout上顯式調用operator <<會導致意外輸出?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM