[llvm] [ADT] Make Zippy more iterator-like for lifetime safety (PR #112441)

Jakub Kuderski via llvm-commits llvm-commits at lists.llvm.org
Wed Oct 16 06:27:57 PDT 2024


================
@@ -704,10 +704,12 @@ struct zip_common : public zip_traits<ZipType, ReferenceTupleType, Iters...> {
   using value_type = typename Base::value_type;
 
   std::tuple<Iters...> iterators;
+  mutable std::optional<value_type> value;
 
 protected:
-  template <size_t... Ns> value_type deref(std::index_sequence<Ns...>) const {
-    return value_type(*std::get<Ns>(iterators)...);
+  template <size_t... Ns> const value_type &deref(std::index_sequence<Ns...>) const {
+    value.emplace(*std::get<Ns>(iterators)...);
+    return *value;
----------------
kuhar wrote:

What's the difference between emplace and assignment here?

https://github.com/llvm/llvm-project/pull/112441


More information about the llvm-commits mailing list