簡體   English   中英

為什么字符串支持`operator =(char)`?

[英]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');

這將禁止分配給單個_Elemchar )。

這個賦值運算符是否有任何原因? 正如同一位同事正確注意到的那樣,

double d;
char c = d;

是允許的

int* p = d;

不是(對於任何指針大小) - 可能是因為從數字到指針的隱式轉換被認為是危險的。 事實上,它甚至似乎已經變成了C ++ 11,據我所知,它在數據類型管理方面試圖非常嚴格和有用。

30年前寫過導入std::string的庫的人認為這是個好主意。

在標准化之前,它沒有被刪除。

從那時起,刪除它將有可能破壞遺留代碼,這是一種成本。

deprecated屬性最近才添加到C ++中,它允許一種標准的方式告訴用戶一個函數很快就會消失。 沒有人設法讓它被棄用,這是一個明智的步驟需要它被刪除(只是刪除它將是粗魯的)。 我鼓勵你提出這樣的建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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