2015-07-06 52 views
-1

無意中我碰到以下情況:爲什麼`std :: string`的賦值運算符是按值而不是`const`引用`char`的?

int i = 1000; 
string s; 
s = i; // ok, but value of `s` is not 1000! 

這種情況已從string標準庫的建立是由於以下操作:

string& string::operator=(_CharT __c) 
{ 
    this->assign(1, __c); 
    return *this; 
} 

現在,這是建立一個不想要的不良影響,其中意外,我們可能結束up給string分配一個整數給錯誤的值!
例如,在我的情況下,i之前是string,然後我轉換爲int。代碼仍在編譯,但由於其對整體代碼的明顯不利影響,程序崩潰了。

這種情況就可以避免,如果它是:

string& operator=(const _CharT& c); 

這背後以上版本不具有動機是什麼?

+4

你可能想重新考慮你的前提:http://coliru.stacked-crooked.com/a/68856fcbf9f12175 – chris

+1

另一個[住在這裏](http://ideone.com/Ztd2T6)。 CNR。逐字逐句的MCVE在展示你看到的任何東西方面都會有很長的路要走,因爲我們不是。 – WhozCraig

+0

@chris,謝謝指出。我現在編輯了我的問題。 – iammilind

回答

2

沒有以上版本背後的動機是什麼?

它不能解決問題(它不起作用),它會變慢。

傳遞一個char(或者甚至wchar_tchar32_t)由值是在大多數架構不是創建一個基準,然後通過參考訪問更快,因爲它需要使一指針大小的對象(通常是比char和更大的在64位系統上可能也大於wchar_t),然後通過指針進行間接尋址。

因此,它不會解決您試圖解決它的問題只會使代碼變慢。雙重不好。

C++允許int進行字符轉換,所以你建議的重載只會創建臨時的,然後綁定一個引用。看到http://open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#2372更好的「修復」,它有自己的問題,可能不會發生。

相關問題