![](/img/trans.png)
[英]Why does calling cout.operator<<(const char*) print the address instead of the character string?
[英]Why does string support `operator=(char)`?
今天我的一位同事在我們的代碼中發現了一個非常微妙的錯誤,基本上是這樣的:
double d = 65;
std::string s = "Hello world";
// .. somewhere later, accidentally assigning to s instead of a similarly
// named numerical variable.
s = d;
// s is now 'A'
我發現,發生這個錯誤的原因是std::basic_string<_Elem>
有一個賦值運算符
_Myt& operator=(_Elem _Ch)
{ // assign 1 * _Ch
return (assign(1, _Ch));
}
現在編譯器並沒有真正抱怨(很多,如果級別足夠高,它會發出關於縮小轉換的警告)。 我們似乎很早就抓住了這個漏洞,它沒有造成很大的破壞,但我想知道為什么這是允許的。 畢竟,我不能寫
std::string s = 65;
因為std::string
沒有一個帶有char
的(n隱式)構造函數。 將它作為一種迫使你寫作的明確轉換會不會更安全
std::string s = string('A');
這將禁止分配給單個_Elem
( char
)。
這個賦值運算符是否有任何原因? 正如同一位同事正確注意到的那樣,
double d;
char c = d;
是允許的
int* p = d;
不是(對於任何指針大小) - 可能是因為從數字到指針的隱式轉換被認為是危險的。 事實上,它甚至似乎已經變成了C ++ 11,據我所知,它在數據類型管理方面試圖非常嚴格和有用。
30年前寫過導入std::string
的庫的人認為這是個好主意。
在標准化之前,它沒有被刪除。
從那時起,刪除它將有可能破壞遺留代碼,這是一種成本。
deprecated
屬性最近才添加到C ++中,它允許一種標准的方式告訴用戶一個函數很快就會消失。 沒有人設法讓它被棄用,這是一個明智的步驟需要它被刪除(只是刪除它將是粗魯的)。 我鼓勵你提出這樣的建議。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.