我必須誤解如何auto
C++ 11和更高版本解析類型。我有以下代碼:C++ 11從算術運算的自動類型扣除int&和long
void foo(int& x)
{
++x;
}
int main()
{
int i = 2;
int& ir = i;
long L = 5;
auto a = ir/L;
foo(a);
return 0;
}
這將導致編譯器錯誤:
test.cpp: In function 'int main()':
test.cpp:12:10: error: invalid initialization of non-const reference
of type ‘int&’ from an rvalue of type ‘int’
foo(a);
^
test.cpp:1:6: note: initializing argument 1 of ‘void foo(int&)’
void foo(int& x)
^~~
然而,隨着int
(int a = ir/L;
)編譯罰款代替auto
並給出了預期的結果(a == 0
調用foo()
前,以及之後的a == 1
)。在玩完代碼並看到各種錯誤消息之後,我認爲auto
推導爲long int&
。定義函數void bar(int x)
和void bar(const int& x)
會導致錯誤消息:call of overloaded ‘bar(long int&)’ is ambiguous
。從評論
更正:
我不明白怎麼auto x = [int&]/[int]
結果,可以通過非const裁判被傳遞的左值,而auto x = [int&]/[long]
導致右值不了的。
'a'不是參考,它是一個簡單的'長'。 – LogicStuff
^^^^^^ [是的,只是'長'](http://ideone.com/lGpcWt) – StoryTeller
如果你不明白爲什麼它很長,原因是類型提升。你應該[閱讀這個答案](http://stackoverflow.com/questions/6770258/how-do-promotion-rules-work-when-the-signedness-on-either-side-of-a-binary -opera) – StoryTeller