2016-06-07 26 views
5

在最近的一個項目中,我跑進其中我意外地分配一個浮子爲字符串參考誤差(代替浮點數轉換成字符串,則分配給它)。分配一個浮動的字符串引用的作品,爲什麼?

的代碼看起來是這樣的(在兩者的Xcode /蘋果LLVM 7.1和GCC 4.9.2測試):

#include <iostream> 
using namespace std; 

static void get_text(string &s) { 
    s = 1.0f; // Legal (not even a warning!) 
} 

// This version gives a compiler error (as I'd expect) 
// static void get_text(string &s) { 
//  string out = 1.0f; 
//  s = out; 
// } 

int main() { 
    string s; 
    get_text(s); 
    cout << s << endl; // Prints garbage 
    return 0; 
} 

打印字符串明顯地導致垃圾,但我不明白爲什麼這個沒沒有多少警告。 (我最好的猜測是,編譯器做了一些隱式的重新解釋演員從浮動,到int,到內存地址...?)

是否有一個警告,我可以啓用(在Xcode中,理想情況下)會在未來阻止這種事情?

回答

8

這是因爲成員函數:

string& operator=(char ch); 

存在從浮點隱式轉換爲整數類型在C++(char是整數類型)。

通常情況下,你可以使用-Wfloat-conversion在G ++獲得這個轉換的警告,但我試了一下,並沒有發出警告。 (?也許編譯器缺陷)

一個簡單的方法來修改代碼以獲得意想不到的浮動/整數轉換錯誤是:

s = { 1.0f }; 

另一種選擇是做的函數string的返回類型(一般而言這樣的設計是優選的反正具有「出」基準參數):

static string get_text() { return 1.0f; } 

可惜這是周圍使用std::string,將其「設計」時,C++仍然是非常淵許多小的缺陷的一個g,並且不明顯會出現不期望的長期後果。

+0

引人入勝。爲了後代的緣故,我會補充一點,雖然'std :: string'中有一個'operator =(char c)',但沒有一個對應的構造函數需要一個字符 - 這解釋了爲什麼我的問題中第二個版本的get_text()不會編譯。如果我修改第二個版本來閱讀:'串出; out =(char)1.0f;',它編譯。 – s3cur3

相關問題