2011-10-27 53 views
2

這是我的測試案例(注意WTF評論):如何告訴gcc警告我字符串被分配了一個整數值?

TEST(string_assignment) 
{ 
std::string str; 
std::string cheese="Cheese"; 
str=cheese; 
CHECK_EQUAL(cheese, str); 

long lval=0; 
str=lval; //WTF - why does the compiler allow this ? 

str=""; 
str.append(cheese); 
CHECK_EQUAL(cheese, str); 
} 

我要趕的std :: string的情況下,被分配比另一個字符串或一個char *以外的東西。我曾假定編譯器會拒絕不兼容的類型,但它允許它。

如何告訴gcc(版本4.4.3)拒絕這種愚蠢? ...還是有其他方式強制拒絕這些不兼容的類型被分配給std :: string嗎?

+0

@ 0A0D:這裏沒有什麼區別。 –

+0

不好意思,但是**怎麼樣不給字符串**分配一個整數?這不是你可以做的最壞的事情,也不能阻止在C++中完成。 –

+0

@Christian Rau - 我將這個添加到測試用例中,因爲我在我的主項目中更改了一個變量的類型,並且在代碼編譯時感到非常驚訝(是的,使用編譯器爲變量的使用添加書籤) – user1016736

回答

5

的原因在於以下超載存在:

string &operator=(char) 

編譯器可以用單一的隱式轉換滿足你的任務,所以它編譯。

我認爲-Wconversion海灣合作委員會國旗應該處理這個問題,但它似乎並沒有工作,至少在GCC 4.1.2。

+1

+1但如果你可以回答關於檢測它的問題,我也很好奇。 –

+0

其實,我認爲你可以實現這個類,這是一個編譯時錯誤。只需提供一個不會編譯的模板化的「operator =」。但那不符合標準;一個合法的程序可以做一些事情,比如'long x ='x'; someString = x;'。 –

+0

使用-WConversion,我得到「警告:從'int'轉換爲'char'可能會改變它的值。我將嘗試這一點,並通過顯式轉換來解決其報告的任何其他問題。 – user1016736

3

因爲它不能。最終,由於C兼容性:與所有其他內置數字類型一樣,long將隱式轉換爲char。所以爲了禁止這個,你也必須禁止someString = someChar。這不會讓我感到困擾,但無論出於何種原因,委員會認爲這是必要的。

3

它編譯因爲以下超載:

string& operator=(char) 

使用g++ -Wconversion才能打印警告消息。

g++ -Wconversion -Werror將警告視爲錯誤。

+1

+1因爲你實際上回答了這個問題:-)。不僅僅是爲什麼它不抱怨,而是如何得到投訴。 (這也會產生其他的投訴,但其中大多數也會被證明是合理的。) –

+1

不錯 - 加上o-Wconversion和-Werror也強制我檢查一些其他作業! – user1016736

+0

@ user1016736:我認爲啓用所有警告標誌是一個好習慣。我幾乎總是使用'-Wall',但不幸的是,它不包含'-Wconversion',所以需要手動包含它。 – Nawaz

相關問題