#define FALSE 0
#define TRUE 1
#define IDS_MYSTR 123
void FnVariadic(const long nIDS, ...)
{
std::cout << "WITHOUT option IDS" << std::endl;
}
void FnVariadic(const bool bOption, const long nIDS, ...)
{
std::cout << "WITH option IDS" << std::endl;
}
void FnVariadic(const char *pStr, ...)
{
std::cout << "WITHOUT option STR" << std::endl;
}
void FnVariadic(const bool bOption, const char *pStr, ...)
{
std::cout << "WITH option STR" << std::endl;
}
int main()
{
FnVariadic(FALSE, IDS_MYSTR, "abc");
//FnVariadic(IDS_MYSTR, FALSE, "abc"); //???
FnVariadic(TRUE, IDS_MYSTR, "abc");
FnVariadic(IDS_MYSTR, TRUE, "abc"); //???
FnVariadic(FALSE, "abc%s", "abc");
//FnVariadic("abc%d%s", FALSE, "abc");
FnVariadic(TRUE, "abc%s", "abc");
//FnVariadic("abc%d%s", TRUE, "abc");
system("pause");
return 0;
}
有人可以解釋一下這裏怎麼工作funtion超載解析? 令人驚訝的是,如何使用可變參數解析工作函數重載?
//FnVariadic(IDS_MYSTR, FALSE, "abc"); //???
FnVariadic(IDS_MYSTR, TRUE, "abc"); //???
第二個編譯但不是第一個編譯。
(註釋行的意思是不編譯)
我使用VS2017,似乎;
首先3個電話使用void FnVariadic(const bool bOption, const long nIDS, ...)
和最後2個呼叫使用void FnVariadic(const bool bOption, const char *pStr, ...)
它也intresting那裏。我期望的是應該調用沒有布爾參數的重載。
您的問題FALSE是#define'd,因爲0等於空指針常量,因此解析在long和const char *重載之間是不明確的。這種情況只存在於字面常量0,這就是爲什麼設計nullptr的原因(但正如你所看到的,問題仍然存在於語言中)。 – Shaggi
爲什麼你需要用宏定義'true'和'false'?這些布爾常量是在語言時代之前建立起來的。 – AndyG
@AndyG我們正在使用mfc/atl。這些代碼已被寫入,沒有布爾真/假。這些定義已被使用。但我想了解超負荷解決。不尋找解決方案。 –