2009-07-24 42 views
19

今天我在程序中遇到了一個有趣的情況,那就是我無意中將一個無符號整數賦值給std :: string。 VisualStudio C++編譯器沒有給出任何警告或錯誤,但是當我運行該項目時,我碰巧注意到了這個錯誤,並且它給了我字符串的垃圾字符。爲什麼C++允許將整數分配給字符串?

這是那種眼神什麼的代碼,如:

std::string my_string(""); 
unsigned int my_number = 1234; 
my_string = my_number; 

下面的代碼也編譯罰款:

std::string my_string(""); 
unsigned int my_number = 1234; 
my_string.operator=(my_number); 

在一個錯誤的結果如下:

unsigned int my_number = 1234; 
std::string my_string(my_number); 

什麼正在進行?編譯器如何使用最後一個代碼塊停止構建,但讓前兩個代碼塊構建?

+0

什麼是編譯器錯誤? 對我來說,g ++ v4.4編譯並正常工作 – CsTamas 2009-07-24 13:47:37

+0

對不起,我對第二個代碼塊犯了一個錯誤 - 它確實會編譯。 最後一個失敗的錯誤是沒有接受無符號整數的std :: string構造函數。 – user55417 2009-07-24 13:55:12

回答

28

因爲字符串可從char分配,並且int可以隱式轉換爲char

+0

爲何最後2個塊沒有隱式轉換int? 你是什麼意思,我不能明確地調用operator =?因爲以下工作: my_string.operator =(「hello world」); – user55417 2009-07-24 13:43:21

20

的std :: string類具有定義的下列賦值運算符:

string& operator=(char ch); 

此運算是由unsigned int隱式轉換調用char

在你的第三個情況下,您使用的是明確的構造函數實例化一個std::string,沒有可用的構造函數可以接受unsigned int,或者使用隱式轉換從unsigned int

string(); 
string(const string& s); 
string(size_type length, const char& ch); 
string(const char* str); 
string(const char* str, size_type length); 
string(const string& str, size_type index, size_type length); 
string(input_iterator start, input_iterator end); 
2

這肯定是運營商=( char ch)調用 - 我的調試器進入該調試​​。而我的MS VS 2005編譯以下沒有錯誤。

std::string my_string(""); 
unsigned int my_number = 1234; 
my_string = my_number; 
my_string.operator=(my_number); 
0

我可以解釋第一和第三種情況:

my_string = 1234; 

這工作,因爲字符串已覆蓋運算符=(字符)。實際上,您將字符(數據溢出)分配到字符串中。我不知道爲什麼第二種情況會導致編譯錯誤。我嘗試了GCC的代碼,它編譯。

std::string my_string(1234); 

將不起作用,因爲沒有字符串構造函數需要char或int參數。

相關問題