Fixes for C++20 support.

* Use ABSL_CONST_INIT on definitions, not just declarations.
* std::string::reserve() (with no args) is deprecated.  I think this use
  was just a bug.
* Structs with user-declared constructors are no longer aggregates.
  Provide a full constructor.
* std::iterator is gone.

Bug: chromium:1284275
PiperOrigin-RevId: 446760317
diff --git a/quiche/http2/adapter/http2_protocol.cc b/quiche/http2/adapter/http2_protocol.cc
index 7281050..6469d32 100644
--- a/quiche/http2/adapter/http2_protocol.cc
+++ b/quiche/http2/adapter/http2_protocol.cc
@@ -6,15 +6,15 @@
 namespace http2 {
 namespace adapter {
 
-const char kHttp2MethodPseudoHeader[] = ":method";
-const char kHttp2SchemePseudoHeader[] = ":scheme";
-const char kHttp2AuthorityPseudoHeader[] = ":authority";
-const char kHttp2PathPseudoHeader[] = ":path";
-const char kHttp2StatusPseudoHeader[] = ":status";
+ABSL_CONST_INIT const char kHttp2MethodPseudoHeader[] = ":method";
+ABSL_CONST_INIT const char kHttp2SchemePseudoHeader[] = ":scheme";
+ABSL_CONST_INIT const char kHttp2AuthorityPseudoHeader[] = ":authority";
+ABSL_CONST_INIT const char kHttp2PathPseudoHeader[] = ":path";
+ABSL_CONST_INIT const char kHttp2StatusPseudoHeader[] = ":status";
 
-const uint8_t kMetadataFrameType = 0x4d;
-const uint8_t kMetadataEndFlag = 0x04;
-const uint16_t kMetadataExtensionId = 0x4d44;
+ABSL_CONST_INIT const uint8_t kMetadataFrameType = 0x4d;
+ABSL_CONST_INIT const uint8_t kMetadataEndFlag = 0x04;
+ABSL_CONST_INIT const uint16_t kMetadataExtensionId = 0x4d44;
 
 std::pair<absl::string_view, bool> GetStringView(const HeaderRep& rep) {
   if (absl::holds_alternative<absl::string_view>(rep)) {
diff --git a/quiche/http2/hpack/huffman/hpack_huffman_encoder_test.cc b/quiche/http2/hpack/huffman/hpack_huffman_encoder_test.cc
index 15ee375..6d73345 100644
--- a/quiche/http2/hpack/huffman/hpack_huffman_encoder_test.cc
+++ b/quiche/http2/hpack/huffman/hpack_huffman_encoder_test.cc
@@ -54,7 +54,7 @@
     size_t encoded_size = HuffmanSize(plain_string);
     EXPECT_EQ(huffman_encoded.size(), encoded_size);
     std::string buffer;
-    buffer.reserve();
+    buffer.reserve(huffman_encoded.size());
     Encode(plain_string, encoded_size, &buffer);
     EXPECT_EQ(buffer, huffman_encoded) << "Error encoding " << plain_string;
   }
diff --git a/quiche/quic/core/http/http_constants.cc b/quiche/quic/core/http/http_constants.cc
index ea372cd..39d9f5e 100644
--- a/quiche/quic/core/http/http_constants.cc
+++ b/quiche/quic/core/http/http_constants.cc
@@ -25,7 +25,7 @@
   return absl::StrCat("UNSUPPORTED_SETTINGS_TYPE(", identifier, ")");
 }
 
-const absl::string_view kUserAgentHeaderName = "user-agent";
+ABSL_CONST_INIT const absl::string_view kUserAgentHeaderName = "user-agent";
 
 #undef RETURN_STRING_LITERAL  // undef for jumbo builds
 
diff --git a/quiche/quic/core/qpack/qpack_instructions.h b/quiche/quic/core/qpack/qpack_instructions.h
index 212f093..a964242 100644
--- a/quiche/quic/core/qpack/qpack_instructions.h
+++ b/quiche/quic/core/qpack/qpack_instructions.h
@@ -71,6 +71,9 @@
 // string literal type to guarantee that all bytes of the instruction are
 // consumed.
 struct QUIC_EXPORT_PRIVATE QpackInstruction {
+  QpackInstruction(QpackInstructionOpcode opcode, QpackInstructionFields fields)
+      : opcode(std::move(opcode)), fields(std::move(fields)) {}
+
   QpackInstruction(const QpackInstruction&) = delete;
   const QpackInstruction& operator=(const QpackInstruction&) = delete;
 
diff --git a/quiche/spdy/core/spdy_intrusive_list.h b/quiche/spdy/core/spdy_intrusive_list.h
index 4fb4967..bbced57 100644
--- a/quiche/spdy/core/spdy_intrusive_list.h
+++ b/quiche/spdy/core/spdy_intrusive_list.h
@@ -268,10 +268,13 @@
   // variant of T and the matching qualified link type. Essentially, QualifiedT
   // will either be 'T' or 'const T', the latter for a const_iterator.
   template <typename QualifiedT, typename QualifiedLinkT>
-  class QUICHE_EXPORT_PRIVATE iterator_impl
-      : public std::iterator<std::bidirectional_iterator_tag, QualifiedT> {
+  class QUICHE_EXPORT_PRIVATE iterator_impl {
    public:
-    typedef std::iterator<std::bidirectional_iterator_tag, QualifiedT> base;
+    using iterator_category = std::bidirectional_iterator_tag;
+    using value_type = QualifiedT;
+    using difference_type = std::ptrdiff_t;
+    using pointer = QualifiedT*;
+    using reference = QualifiedT&;
 
     iterator_impl() = default;
     iterator_impl(QualifiedLinkT* link) : link_(link) {}
@@ -291,10 +294,8 @@
       return link_ != x.link_;
     }
 
-    typename base::reference operator*() const { return *operator->(); }
-    typename base::pointer operator->() const {
-      return link_->cast_to_derived();
-    }
+    reference operator*() const { return *operator->(); }
+    pointer operator->() const { return link_->cast_to_derived(); }
 
     QualifiedLinkT* link() const { return link_; }