我有一個關於modf
的超載分辨率的問題。modf的過載分辨率
考慮下面的代碼。
#include <iostream>
#include <iomanip>
#include <climits>
#include <cmath>
int main()
{
unsigned long ul = ULONG_MAX;
long double ipart;
long double fpart = std::modf(ul, &ipart);
std::cout << std::fixed << std::setprecision(0)
<< ul << ", " << ipart << ", " << fpart << '\n'
<< static_cast<double>(ul) << '\n';
}
在我的測試環境中,代碼輸出...
18446744073709551615, 18446744073709551615, 0
18446744073709551616
比照http://melpon.org/wandbox/permlink/7ZF2CwqEwBRU5hg4
C++ 14標準26.8 [c.math] P.11說,
此外,存在應足以確保附加重載:
如果任何算術參數對應到
double
參數的類型爲long double
,則對應於double
參數的所有算術參數被有效地轉換爲long double
。否則,如果對應於
double
參數的任何算術參數的類型爲double
或整數類型,則對應於double
參數所有算術 參數被有效地轉換爲double
。否則,對應於
double
參數的所有算術參數的類型爲float
。
變量ul
沒有類型long double
但整數類型,所以我覺得應該ul
被轉換爲 double
,然後ipart
應該是18446744073709551616
。 (也就是說,海灣合作委員會的行爲是錯誤的。)
我對這種行爲有誤解嗎? (當然,我認爲海灣合作委員會的行爲更可取。)
你正在調用'std :: modf'的long double變體,但是你的靜態轉換隻能用'double'完成。 「所以我認爲ul應該被翻倍」:你錯了,'ul'被轉換成'long double' –