Always generate an initializer list
diff --git a/compiler/cpp/src/thrift/generate/t_cpp_generator.cc b/compiler/cpp/src/thrift/generate/t_cpp_generator.cc
index ccb79bc..2a65bfb 100644
--- a/compiler/cpp/src/thrift/generate/t_cpp_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_cpp_generator.cc
@@ -1004,64 +1004,70 @@
   std::string clsname_ctor = tstruct->get_name() + "::" + tstruct->get_name() + "()";
   indent(out) << clsname_ctor << (has_default_value ? "" : " noexcept");
 
-  if (has_default_value || is_exception) {
-    // We need an initializer block
+  //
+  // Start generating initializer list
+  //
 
-    bool init_ctor = false;
-    std::string args_indent("   ");
+  bool init_ctor = false;
+  std::string args_indent("   ");
 
-    // Default-initialize TException, if it is our base type
-    if (is_exception)
-    {
-      out << "\n";
-      indent(out) << " : ";
-      out << "TException()";
-      init_ctor = true;
-    }
-
-    // Default-initialize all members that should be initialized in
-    // the initializer block
-    for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-      t_type* t = get_true_type((*m_iter)->get_type());
-      if (t->is_base_type() || t->is_enum() || is_reference(*m_iter)) {
-        string dval;
-        t_const_value* cv = (*m_iter)->get_value();
-        if (cv != nullptr) {
-          dval += render_const_value(out, (*m_iter)->get_name(), t, cv);
-        } else if (t->is_enum()) {
-          dval += "static_cast<" + type_name(t) + ">(0)";
-        } else {
-          dval += (t->is_string() || is_reference(*m_iter)) ? "" : "0";
-        }
-        if (!init_ctor) {
-          out << "\n";
-          indent(out) << " : ";
-          init_ctor = true;
-        } else {
-          out << ",\n";
-          indent(out) << args_indent;
-        }
-
-        out << (*m_iter)->get_name() << "(" << dval << ")";
-      }
-    }
-    out << " {" << endl;
-    indent_up();
-    // TODO(dreiss): When everything else in Thrift is perfect,
-    // do more of these in the initializer list.
-    for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-      t_type* t = get_true_type((*m_iter)->get_type());
-      if (!t->is_base_type() && !t->is_enum() && !is_reference(*m_iter)) {
-        t_const_value* cv = (*m_iter)->get_value();
-        if (cv != nullptr) {
-          print_const_value(out, (*m_iter)->get_name(), t, cv);
-        }
-      }
-    }
-    scope_down(out);
-  } else {
-    out << " {}\n";
+  // Default-initialize TException, if it is our base type
+  if (is_exception)
+  {
+    out << "\n";
+    indent(out) << " : ";
+    out << "TException()";
+    init_ctor = true;
   }
+
+  // Default-initialize all members that should be initialized in
+  // the initializer block
+  for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
+    t_type* t = get_true_type((*m_iter)->get_type());
+    if (t->is_base_type() || t->is_enum() || is_reference(*m_iter)) {
+      string dval;
+      t_const_value* cv = (*m_iter)->get_value();
+      if (cv != nullptr) {
+        dval += render_const_value(out, (*m_iter)->get_name(), t, cv);
+      } else if (t->is_enum()) {
+        dval += "static_cast<" + type_name(t) + ">(0)";
+      } else {
+        dval += (t->is_string() || is_reference(*m_iter)) ? "" : "0";
+      }
+      if (!init_ctor) {
+        init_ctor = true;
+        if(has_default_value) {
+          out << " : ";
+        } else {
+          out << '\n' << args_indent << ": ";
+          args_indent.append("  ");
+        }
+      } else {
+        out << ",\n" << args_indent;
+      }
+
+      out << (*m_iter)->get_name() << "(" << dval << ")";
+    }
+  }
+
+  //
+  // Start generating body
+  //
+
+  out << " {" << endl;
+  indent_up();
+  // TODO(dreiss): When everything else in Thrift is perfect,
+  // do more of these in the initializer list.
+  for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
+    t_type* t = get_true_type((*m_iter)->get_type());
+    if (!t->is_base_type() && !t->is_enum() && !is_reference(*m_iter)) {
+      t_const_value* cv = (*m_iter)->get_value();
+      if (cv != nullptr) {
+        print_const_value(out, (*m_iter)->get_name(), t, cv);
+      }
+    }
+  }
+  scope_down(out);
 }
 
 void t_cpp_generator::generate_copy_constructor(ostream& out,