我有2個功能,如下圖所示明確的函數調用引發錯誤?這是超載有效
void GetValue(unsigned int){}
void GetValue(unsigned long){}
如果我撥打電話的GetValue(4294967296)我獲取以下錯誤「模糊函數調用」。 既然int和long的大小都是4字節,這個重載是否會起作用?
我有2個功能,如下圖所示明確的函數調用引發錯誤?這是超載有效
void GetValue(unsigned int){}
void GetValue(unsigned long){}
如果我撥打電話的GetValue(4294967296)我獲取以下錯誤「模糊函數調用」。 既然int和long的大小都是4字節,這個重載是否會起作用?
超載是有效的,但在這裏,你必須在這兩種情況下,從符號值一個類型轉換爲無符號。因此編譯器不能在兩者之間選擇。因此你的程序不能編譯。
除非您使用顯式類型鑄造GetValue((unsigned int)4294967696);
,否則無法讓他選擇sizeof(int)= sizeof(long)= 4個字節的32位系統。文字規範是同爲int
和long
類型u
或U
:http://en.cppreference.com/w/cpp/language/integer_literal
但是你可以讓編譯器選擇,如果你有int和長(可在64位系統的情況下)的大小不同。在這種情況下,編譯器根據變量的範圍選擇。
所以,你可以把它編譯,如果你給一個無符號的文字:
GetValue(4294967696u);
4294967296超出範圍爲int,它是0..4,294,967,295 4字節長的無符號整型。並且在8字節長的無符號long範圍內。 (見http://msdn.microsoft.com/en-us/library/s3f49ktz(v=vs.90).aspx)因此,程序將調用長功能。
#include <iostream>
using namespace std;
void GetValue(unsigned int x){cout << "int " << x << endl;}
void GetValue(unsigned long x){cout << "long " << x << endl;}
int main() {
GetValue(4294967295u);
GetValue(4294967696u);
GetValue(static_cast<unsigned int>(4294967696));
cout << sizeof(unsigned int) << " " << sizeof(unsigned long) << endl;
}
與用gcc輸出在64位系統:
該程序並根據該文字範圍內編譯並選擇不同的功能
int 4294967295
long 4294967696
int 400
4 8
爲什麼第三個'400'? –
@ColeJohnson,因爲4294967696超出了無符號整型(即0..4,294,967,295)的範圍,所以它在類型轉換時被截斷。 – klm123
噢。我的錯。 –
只是您的通話類型,例如。的GetValue((unsigned int類型)4294967296)
UMM,無,如果您收到錯誤消息。 – user1810087
您如何期待編譯器知道要調用哪一個?你的常量既不是'unsigned int'也不是'unsigned long',所以它們都匹配得很好(或者同樣嚴重)。 –