[英]Why does msvc let me do this but not gcc / g++?
在msvc中,我有這樣的函數,它構建但在gcc中它不喜歡它。
void classname::a(std::string &text)
{
stdStringFromClass = text;
}
void classname::b(char *text)
{
a(std::string(text));
}
這里的問題是&,gcc我覺得很擔心,因為我剛剛創建了std :: string,通過引用傳遞是有風險的,所以它不構建,但msvc甚至沒有警告我。
為什么這個錯誤的c ++到gcc我一直聽說msvc比gcc更嚴格。
謝謝
錯誤
AguiWidgetBase.cpp: In member function ‘void AguiWidgetBase::setText(char*)’:
AguiWidgetBase.cpp:91:27: error: no matching function for call to ‘AguiWidgetBase::setText(std::string)’
AguiWidgetBase.cpp:80:6: note: candidates are: void AguiWidgetBase::setText(std::string&)
AguiWidgetBase.cpp:88:6: note: void AguiWidgetBase::setText(char*)
這可以嗎?
void classname::a(std::string &text)
{
stdStringFromClass = text;
}
void classname::b(char *text)
{
std::string k = text;
a(k);
}
我認為這是Visual Studio當時支持的舊編譯器擴展,但它在現代Visual C ++中保持兼容性。 嘗試禁用編譯器擴展( /Za
標志),看看會發生什么。
或者,使用/W4
標志獲取最大警告,它應該抱怨:
警告C4239:使用非標准擴展
在GCC上我得到const引用錯誤:
錯誤:從'std :: string'類型的臨時值初始化'std :: string&'類型的非const引用
我不知道為什么Visual Studio允許你編譯它,但你不能傳遞對匿名對象的引用。
編輯:它可以用於const引用,因為你可以傳遞臨時對象作為參考,只是能夠修改它沒有意義。 這就是為什么我們在C ++ 0x中有rvalue引用。
編輯2:對於你的編輯,肯定會解決問題,或者只是在a()
方法中將const引用作為參數,你似乎沒有修改參數。
我相信有人先說過這個,但是傳遞對匿名對象的引用是非法的。 Visual C ++很奇怪。 要修復它,請嘗試以下方法:
void class::a(const std::string &text)
{
stdStringFromClass = text;
}
void class::b(const char *text)
{
a(std::string(text));
}
順便說一句,我認為你的班級名稱實際上並不是“班級”,而你只是將其用作占位符,因為
class class {
// ...
};
東西是非法的。
沒有實際的錯誤消息,我只能猜測:class是一個保留關鍵字,你應該以不同的方式命名你的類,這不是一個有效的方法定義:
void class::a(std::string &text) { ... }
編輯:問題在於傳遞匿名引用,正如其他人指出的那樣。 你現在可以忽略這個答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.