Add arena enabled copy construction.

Arena enabled copy construction provides efficiency gains for the rather common construct where a message is currently copied by first creating a default initialized instance through the regular (arena) constructor, and then recursively filled from the source message using 'MergeFrom' or 'CopyFrom'.

Arena enabled copy construction is feature gated in port_def.inc and currently not enabled by default.

PiperOrigin-RevId: 558854125
diff --git a/src/google/protobuf/compiler/cpp/field_generators/primitive_field.cc b/src/google/protobuf/compiler/cpp/field_generators/primitive_field.cc
index 8db2b3b..dcd2ecb 100644
--- a/src/google/protobuf/compiler/cpp/field_generators/primitive_field.cc
+++ b/src/google/protobuf/compiler/cpp/field_generators/primitive_field.cc
@@ -353,9 +353,11 @@
         $field_$.DeleteIfNotDefault();
       )cc");
     } else {
+#ifndef PROTOBUF_EXPLICIT_CONSTRUCTORS
       p->Emit(R"cc(
         $field_$.~RepeatedField();
       )cc");
+#endif  // !PROTOBUF_EXPLICIT_CONSTRUCTORS
     }
   }
 
@@ -394,6 +396,31 @@
     GenerateCacheSizeInitializer(p);
   }
 
+  void GenerateMemberConstexprConstructor(io::Printer* p) const override {
+    p->Emit("$name$_{}");
+    if (HasCachedSize()) {
+      p->Emit(",\n_$name$_cached_byte_size_{0}");
+    }
+  }
+
+  void GenerateMemberConstructor(io::Printer* p) const override {
+    p->Emit("$name$_{visibility, arena}");
+    if (HasCachedSize()) {
+      p->Emit(",\n_$name$_cached_byte_size_{0}");
+    }
+  }
+
+  void GenerateMemberCopyConstructor(io::Printer* p) const override {
+    p->Emit("$name$_{visibility, arena, from.$name$_}");
+    if (HasCachedSize()) {
+      p->Emit(",\n_$name$_cached_byte_size_{0}");
+    }
+  }
+
+  void GenerateOneofCopyConstruct(io::Printer* p) const override {
+    ABSL_LOG(FATAL) << "Not supported";
+  }
+
   void GeneratePrivateMembers(io::Printer* p) const override;
   void GenerateAccessorDeclarations(io::Printer* p) const override;
   void GenerateInlineAccessorDefinitions(io::Printer* p) const override;