Add inplace constructors for QuicheMemSlice and QuicheMemSliceImpl and use them in quic::WriteGfeMemSliceSpanToStream and video_streaming::QuicExternalRequest::WriteBody.

This avoids the creation of 3 temporary gfe2::MemSlice objects for every QuicheMemSlice created.

PiperOrigin-RevId: 454970726
diff --git a/quiche/common/platform/api/quiche_mem_slice.h b/quiche/common/platform/api/quiche_mem_slice.h
index bb703a4..42c3e58 100644
--- a/quiche/common/platform/api/quiche_mem_slice.h
+++ b/quiche/common/platform/api/quiche_mem_slice.h
@@ -31,9 +31,13 @@
   QuicheMemSlice(std::unique_ptr<char[]> buffer, size_t length)
       : impl_(std::move(buffer), length) {}
 
-  // Constructs QuicheMemSlice from |impl|. It takes the reference away from
-  // |impl|.
-  explicit QuicheMemSlice(QuicheMemSliceImpl impl) : impl_(std::move(impl)) {}
+  // Ensures the use of the in-place constructor (below) is intentional.
+  struct InPlace {};
+
+  // Constructs a QuicheMemSlice by constructing |impl_| in-place.
+  template <typename... Args>
+  explicit QuicheMemSlice(InPlace, Args&&... args)
+      : impl_{std::forward<Args>(args)...} {}
 
   QuicheMemSlice(const QuicheMemSlice& other) = delete;
   QuicheMemSlice& operator=(const QuicheMemSlice& other) = delete;