У меня есть примерный код, который ведет себя по-другому в Visual С++ 2012 с новыми заголовками С++ 11, чем в VС++ 2010. Это касается того, что происходит, когда вы вызываете функцию std:: fmod, которую вы получаете, когда включаете cmath, а когда аргументы, которые вы передаете, не удваиваются, а скорее являются классами, которые имеют неявное преобразование в двойной оператор:
#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, которая принимает два удвоения.
Итак, мой вопрос в том, правильно ли это соответствует стандарту С++ 11? Единственная информация, которую я могу найти в поведении, находится в документации cppreference.com здесь, в которой говорится (выделено мной):
Если какой-либо аргумент имеет целочисленный тип, он преобразуется в double. Если любой другой аргумент длинный двойной, то тип возврата длинный двойной, , в противном случае он будет двойной.
Однако реализация в заголовочных файлах Visual Studio, по-видимому, реализует "иначе это float".
Кто-нибудь знает, в чем заключается намерение:-)?
Запустив пример через онлайн-версию С++ 11 GCC (у меня нет простого доступа к недавней копии GCC в противном случае), она, по-видимому, вызывает "двойную" версию fmod, что и есть Я наивно ожидаю.
Для ясности я использую
Microsoft (R) C/С++ Оптимизация компилятора версии 17.00.51106.1 для x86
что есть с
Microsoft Visual Studio Express 2012 для Windows Desktop версии 11.0.51106.01 Обновление 1