char f1();
void f2(char&);
struct A {};
A f3();
void f4(A&);
int main()
{
f2(f1()); // error C2664. This is as expected.
f4(f3()); // OK! Why???
}
錯誤C2664: '無效F4(炭&)':不能從 '字符' 轉換參數1至爲什麼非const引用參數可以綁定到臨時對象?
我被教導 '字符&',在C++一個非const引用參數不能綁定到臨時對象;並在上面的代碼中,f2(f1());
按預期觸發錯誤。
但是,爲什麼相同的規則不適用於代碼行f4(f3());
?
PS:我的編譯器是VC++ 2013.即使我在註釋行f2(f1());
,那麼包含f4(f3());
的代碼將被編譯時不會出現任何錯誤或警告。
更新:
MSDN說:
在Visual C++的早期版本中,非const引用可以 綁定到臨時對象。現在,臨時對象只能綁定 以引用const。
所以我認爲這是一個VC++的bug。我已經向VC++ team提交了一個錯誤報告
你嘗試不F2大廈(F1() )在代碼中?它可能會停在第一個錯誤。 – scaryrawr
如果我註釋行'f2(f1());',那麼代碼就OK了。 – xmllmx
MSVC以支持這種編譯器擴展而聞名。不知道大約2013. – yngccc