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,
