Because a temperature change of 212ºF is equal to a temperature change of 117.778ºC = (5/9)*212. What would you expect the following to do:
? What does multiplying an absolute temperature by 2 mean? Should the last two lines give me 32+32 = 64 and 0+0 = 0? Why would the order of conversion matter? I understand the desire for temperature to equate to the common interpretation, but this approach quickly becomes problematic when you allow arithmetic operations. The same issue arises in std::chrono in differentiating between specific time points and durations. If you want a temperature point, use quantity< absolute<fahrenheit::temperature> >. This will have the added benefit of allowing conversions but disallowing operations that don't make sense... Some code:
#include <iostream>
#include <boost/units/absolute.hpp>
#include <boost/units/systems/temperature/celsius.hpp>
#include <boost/units/systems/temperature/fahrenheit.hpp>
#include <boost/units/systems/si/temperature.hpp>
#include <boost/units/base_units/temperature/conversions.hpp>
using namespace boost::units;
int main()
{
quantity<celsius::temperature> dTC(10.*celsius::temperature());
quantity<fahrenheit::temperature> dTF(10.*fahrenheit::temperature());
quantity<si::temperature> dTK(10.*si::kelvin);
std::cout << dTC << std::endl;
std::cout << dTF << std::endl;
std::cout << dTK << std::endl;
quantity<absolute<celsius::temperature> > TC(0*absolute<celsius::temperature>());
quantity<absolute<fahrenheit::temperature> > TF(32.*absolute<fahrenheit::temperature>());
quantity<absolute<si::temperature> > TK(0.*absolute<si::temperature>());
std::cout << TC << std::endl;
std::cout << TF << std::endl;
std::cout << TK << std::endl;
std::cout << quantity<absolute<celsius::temperature> >(TF) << std::endl;
std::cout << quantity<absolute<celsius::temperature> >(TK) << std::endl;
std::cout << quantity<absolute<fahrenheit::temperature> >(TC) << std::endl;
std::cout << quantity<absolute<fahrenheit::temperature> >(TK) << std::endl;
// std::cout << TC+quantity<absolute<celsius::temperature> >(TF) << std::endl; // fails because you cannot add two absolute temperatures
std::cout << TC+quantity<celsius::temperature>(dTF) << std::endl;
std::cout << TF+quantity<fahrenheit::temperature>(dTC) << std::endl;
return 0;
}