我有一些示例代碼,在Visual C++ 2012下使用新的C++ 11頭文件的行爲與在VC++ 2010下的行爲不同。 它涉及當調用的std :: FMOD功能,你得到當你包括CMATH會發生什麼,當你傳遞參數不雙打,但相當有一個隱式轉換到雙操作類:fmod(和其他)的不同行爲在Visual Studio中至少有
#include <cmath>
class Num {
double d_;
public:
Num(double d) : d_(d) {}
operator double() const { return d_; }
};
int main(int argc, char* argv[]) {
Num n1(3.14159265358979323846264338327950288419716939937510);
Num n2(2.0);
double result1 = fmod((double)n1, (double)n2);
double result2 = fmod((float)n1, (float)n2);
double result3 = fmod(n1, n2);
if (result2==result1) std::cout << "fmod(double, double) returns the same as fmod(float,float)" << std::endl;
if (result3==result1) std::cout << "fmod(Num, Num) returns the same as fmod(double,double)" << std::endl;
if (result3==result2) std::cout << "fmod(Num, Num) returns the same as fmod(float,float)" << std::endl;
}
更令人驚訝的是,這會調用帶有兩個浮點數的fmod版本,而不是使用兩個雙精度浮點數的fmod版本。
所以我的問題是,這是給C++ 11標準的正確行爲?我能找到的行爲的唯一信息是cppreference.com文檔here,它說(重點煤礦)中:
如果任何參數有整型,它被轉換爲加倍。如果任何其他參數是長雙倍,那麼返回類型是長雙倍,,否則它是雙倍。
但是,在Visual Studio頭文件中的實現似乎實現「否則它是一個浮動」。
任何人都知道這個意圖是什麼:-)?
通過在線C++ 11版本的GCC運行該示例(我沒有簡單訪問GCC的最新副本,否則)它似乎是調用fmod的「雙」版本,它是我天真地期待的。
爲了清楚起見,我使用
微軟(R)C/C++優化編譯器版本17.00.51106.1用於x86
這就是自帶
的Microsoft Visual Studio Express 2012 for Windows Desktop版本11.0.51106.01更新1
你怎麼證明它是調用'float'版本? – NPE 2013-03-22 14:27:34
我通過它調試了一下。我還沒有一個例子證明它正在做什麼並且將會更新哪一種方式。 – 2013-03-22 14:43:19
太好了。我認爲看到SSCCE(http://sscce.org/)會很有幫助,並且還有你的編譯器版本的全部細節。 – NPE 2013-03-22 14:46:08