Update documentation and tests for fxcrt::Zip()

It turns out that zip(), as currently written, can be used to compare
two const spans, because `T&&` inside a template is interpreted as a
forwarding reference.

Document and test this before using it in code in this manner.

Change-Id: I8ad7b335cb5ca799a8afc269e000e29a6f172cc5
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/127770
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
Reviewed-by: Thomas Sepez <tsepez@google.com>
diff --git a/core/fxcrt/zip.h b/core/fxcrt/zip.h
index 4884a0d..8902f19 100644
--- a/core/fxcrt/zip.h
+++ b/core/fxcrt/zip.h
@@ -36,10 +36,12 @@
 // - Only zips together two or three views instead of N.
 // - Size is determined by the first view, which must be smaller than the
 //   other view(s).
-// - With two views, the first view is presumed to be "input-like" and is const,
-//   second view is presumed to be "output-like" and is non-const.
+// - With two views, the first view is presumed to be "input-like" and is const.
+//   The second view is presumed to be "output-like", can be non-const, and
+//   can be assigned-to if desired.
 // - With three views, the first two views are presumed to be "input-like" and
-//   are const.
+//   are const. The third view is is presumed to be "output-like", can be
+//   non-const, and can be assigned-to if desired.
 // - Only those methods required to support use in a range-based for-loop
 //   are provided.
 
diff --git a/core/fxcrt/zip_unittest.cpp b/core/fxcrt/zip_unittest.cpp
index 46add43..09a2891 100644
--- a/core/fxcrt/zip_unittest.cpp
+++ b/core/fxcrt/zip_unittest.cpp
@@ -43,6 +43,11 @@
     out = in;
   }
   EXPECT_THAT(output, ElementsAreArray(expected));
+
+  // The "output" span can, in fact, be const so long as we don't assign to it.
+  for (auto [in, expect] : Zip(stuff, expected)) {
+    EXPECT_EQ(in, expect);
+  }
 }
 
 TEST(Zip, ActualZip3) {
@@ -55,6 +60,11 @@
     out = in1 + in2;
   }
   EXPECT_THAT(output, ElementsAreArray(expected));
+
+  // The "output" span can, in fact, be const so long as we don't assign to it.
+  for (auto [in1, in2, expect] : Zip(stuff1, stuff2, output)) {
+    EXPECT_EQ(in1 + in2, expect);
+  }
 }
 
 TEST(Zip, BadArgumentsZip) {