簡體   English   中英

為什么msvc讓我這樣做而不是gcc / g ++?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM