diff --git a/samples/monster_generated.h b/samples/monster_generated.h
index 1f9d9f1..a3a2fb2 100644
--- a/samples/monster_generated.h
+++ b/samples/monster_generated.h
@@ -54,7 +54,7 @@
 };
 
 struct EquipmentUnion {
-  Equipment type = Equipment_NONE;
+  Equipment type;
 
   flatbuffers::NativeTable *table = nullptr;
   EquipmentUnion() : type(Equipment_NONE), table(nullptr) {}
diff --git a/src/idl_gen_cpp.cpp b/src/idl_gen_cpp.cpp
index 0436f4d..f308a7b 100644
--- a/src/idl_gen_cpp.cpp
+++ b/src/idl_gen_cpp.cpp
@@ -525,9 +525,7 @@
     if (parser_.opts.generate_object_based_api && enum_def.is_union) {
       // Generate a union type
       code += "struct " + enum_def.name + "Union {\n";
-      code += "  " + enum_def.name + " type = ";
-      code += GetEnumValUse(enum_def, *enum_def.vals.Lookup("NONE"), parser_.opts);
-      code += ";\n\n";
+      code += "  " + enum_def.name + " type;\n\n";
       code += "  flatbuffers::NativeTable *table = nullptr;\n";
       code += "  " + enum_def.name + "Union() : type(";
       code += GetEnumValUse(enum_def, *enum_def.vals.Lookup("NONE"), parser_.opts);
diff --git a/src/reflection.cpp b/src/reflection.cpp
index e2548a4..10b62b2 100644
--- a/src/reflection.cpp
+++ b/src/reflection.cpp
@@ -485,14 +485,14 @@
                   const flatbuffers::Table &parent_table,
                   voffset_t field_offset,
                   const reflection::Object &obj,
-                  bool required) {  
+                  bool required) {
   auto offset = parent_table.GetOptionalFieldOffset(field_offset);
   if (required && !offset) {
     return false;
   }
 
   return !offset || v.Verify(reinterpret_cast<const uint8_t*>(&parent_table)
-                             + offset, obj.bytesize());  
+                             + offset, obj.bytesize());
 }
 
 bool VerifyVectorOfStructs(flatbuffers::Verifier &v,
@@ -520,34 +520,34 @@
                   const reflection::Schema &schema,
                   const flatbuffers::Table &table,
                   const reflection::Field &vec_field) {
-  assert(vec_field.type()->base_type() == reflection::BaseType::Vector);
+  assert(vec_field.type()->base_type() == reflection::Vector);
   if (!table.VerifyField<uoffset_t>(v, vec_field.offset()))
     return false;
 
   switch (vec_field.type()->element()) {
-    case reflection::BaseType::None:
+    case reflection::None:
       assert(false);
       break;
-    case reflection::BaseType::UType:
+    case reflection::UType:
       return v.Verify(flatbuffers::GetFieldV<uint8_t>(table, vec_field));
-    case reflection::BaseType::Bool:
-    case reflection::BaseType::Byte:
-    case reflection::BaseType::UByte:
+    case reflection::Bool:
+    case reflection::Byte:
+    case reflection::UByte:
       return v.Verify(flatbuffers::GetFieldV<int8_t>(table, vec_field));
-    case reflection::BaseType::Short:
-    case reflection::BaseType::UShort:
+    case reflection::Short:
+    case reflection::UShort:
       return v.Verify(flatbuffers::GetFieldV<int16_t>(table, vec_field));
-    case reflection::BaseType::Int:
-    case reflection::BaseType::UInt:
+    case reflection::Int:
+    case reflection::UInt:
       return v.Verify(flatbuffers::GetFieldV<int32_t>(table, vec_field));
-    case reflection::BaseType::Long:
-    case reflection::BaseType::ULong:
+    case reflection::Long:
+    case reflection::ULong:
       return v.Verify(flatbuffers::GetFieldV<int64_t>(table, vec_field));
-    case reflection::BaseType::Float:
+    case reflection::Float:
       return v.Verify(flatbuffers::GetFieldV<float>(table, vec_field));
-    case reflection::BaseType::Double:
+    case reflection::Double:
       return v.Verify(flatbuffers::GetFieldV<double>(table, vec_field));
-    case reflection::BaseType::String: {
+    case reflection::String: {
       auto vecString =
         flatbuffers::GetFieldV<flatbuffers::
         Offset<flatbuffers::String>>(table, vec_field);
@@ -557,10 +557,10 @@
         return false;
       }
     }
-    case reflection::BaseType::Vector:
+    case reflection::Vector:
       assert(false);
       break;
-    case reflection::BaseType::Obj: {
+    case reflection::Obj: {
       auto obj = schema.objects()->Get(vec_field.type()->index());
       if (obj->is_struct()) {
         if (!VerifyVectorOfStructs(v, table, vec_field.offset(), *obj,
@@ -583,7 +583,7 @@
       }
       return true;
     }
-    case reflection::BaseType::Union:
+    case reflection::Union:
       assert(false);
       break;
     default:
@@ -612,53 +612,53 @@
   for (size_t i = 0; i < obj.fields()->size(); i++) {
     auto field_def = obj.fields()->Get(i);
     switch (field_def->type()->base_type()) {
-      case reflection::BaseType::None:
+      case reflection::None:
         assert(false);
         break;
-      case reflection::BaseType::UType:
+      case reflection::UType:
         if (!table->VerifyField<uint8_t>(v, field_def->offset()))
           return false;
         break;
-      case reflection::BaseType::Bool:
-      case reflection::BaseType::Byte:
-      case reflection::BaseType::UByte:
+      case reflection::Bool:
+      case reflection::Byte:
+      case reflection::UByte:
         if (!table->VerifyField<int8_t>(v, field_def->offset()))
           return false;
         break;
-      case reflection::BaseType::Short:
-      case reflection::BaseType::UShort:
+      case reflection::Short:
+      case reflection::UShort:
         if (!table->VerifyField<int16_t>(v, field_def->offset()))
           return false;
         break;
-      case reflection::BaseType::Int:
-      case reflection::BaseType::UInt:
+      case reflection::Int:
+      case reflection::UInt:
         if (!table->VerifyField<int32_t>(v, field_def->offset()))
           return false;
         break;
-      case reflection::BaseType::Long:
-      case reflection::BaseType::ULong:
+      case reflection::Long:
+      case reflection::ULong:
         if (!table->VerifyField<int64_t>(v, field_def->offset()))
           return false;
         break;
-      case reflection::BaseType::Float:
+      case reflection::Float:
         if (!table->VerifyField<float>(v, field_def->offset()))
           return false;
         break;
-      case reflection::BaseType::Double:
+      case reflection::Double:
         if (!table->VerifyField<double>(v, field_def->offset()))
           return false;
         break;
-      case reflection::BaseType::String:
+      case reflection::String:
         if (!table->VerifyField<uoffset_t>(v, field_def->offset()) ||
             !v.Verify(flatbuffers::GetFieldS(*table, *field_def))) {
           return false;
         }
         break;
-      case reflection::BaseType::Vector:
+      case reflection::Vector:
         if (!VerifyVector(v, schema, *table, *field_def))
           return false;
         break;
-      case reflection::BaseType::Obj: {
+      case reflection::Obj: {
         auto child_obj = schema.objects()->Get(field_def->type()->index());
         if (child_obj->is_struct()) {
           if (!VerifyStruct(v, *table, field_def->offset(), *child_obj,
@@ -674,8 +674,8 @@
         }
         break;
       }
-      case reflection::BaseType::Union: {
-        //  get union type from the prev field 
+      case reflection::Union: {
+        //  get union type from the prev field
         voffset_t utype_offset = field_def->offset() - sizeof(voffset_t);
         auto utype = table->GetField<uint8_t>(utype_offset, 0);
         if (utype != 0) {
diff --git a/tests/monster_test_generated.h b/tests/monster_test_generated.h
index eb7a9ff..e52992c 100644
--- a/tests/monster_test_generated.h
+++ b/tests/monster_test_generated.h
@@ -76,7 +76,7 @@
 };
 
 struct AnyUnion {
-  Any type = Any_NONE;
+  Any type;
 
   flatbuffers::NativeTable *table = nullptr;
   AnyUnion() : type(Any_NONE), table(nullptr) {}
