Use one TU-wide locale instead of three
diff --git a/lib/cpp/src/thrift/TToString.h b/lib/cpp/src/thrift/TToString.h
index 474429d..d91c58c 100644
--- a/lib/cpp/src/thrift/TToString.h
+++ b/lib/cpp/src/thrift/TToString.h
@@ -32,11 +32,15 @@
 namespace apache {
 namespace thrift {
 
+// unnamed namespace to enforce internal linkage - could be done with 'inline' when once have C++17
+namespace {
+const auto default_locale = std::locale("C");
+}
+
 template <typename T>
 std::string to_string(const T& t) {
   std::ostringstream o;
-  const static auto locale = std::locale("C");
-  o.imbue(locale);
+  o.imbue(default_locale);
   o << t;
   return o.str();
 }
@@ -45,8 +49,7 @@
 // is enabled.
 inline std::string to_string(const float& t) {
   std::ostringstream o;
-  const static auto locale = std::locale("C");
-  o.imbue(locale);
+  o.imbue(default_locale);
   o.precision(static_cast<std::streamsize>(std::ceil(static_cast<double>(std::numeric_limits<float>::digits * std::log10(2.0f) + 1))));
   o << t;
   return o.str();
@@ -54,8 +57,7 @@
 
 inline std::string to_string(const double& t) {
   std::ostringstream o;
-  const static auto locale = std::locale("C");
-  o.imbue(locale);
+  o.imbue(default_locale);
   o.precision(static_cast<std::streamsize>(std::ceil(static_cast<double>(std::numeric_limits<double>::digits * std::log10(2.0f) + 1))));
   o << t;
   return o.str();
@@ -63,8 +65,7 @@
 
 inline std::string to_string(const long double& t) {
   std::ostringstream o;
-  const static auto locale = std::locale("C");
-  o.imbue(locale);
+  o.imbue(default_locale);
   o.precision(static_cast<std::streamsize>(std::ceil(static_cast<double>(std::numeric_limits<long double>::digits * std::log10(2.0f) + 1))));
   o << t;
   return o.str();