:alembic: try to use GCC 10
diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml
index 1a47a88..a4742e6 100644
--- a/.github/workflows/ubuntu.yml
+++ b/.github/workflows/ubuntu.yml
@@ -8,8 +8,16 @@
 
     steps:
     - uses: actions/checkout@v1
+    - name: install_gcc
+      run: |
+           sudo apt update
+           sudo apt install gcc-10 g++-10
+      shell: bash
     - name: cmake
       run: cmake -S . -B build -D CMAKE_BUILD_TYPE=Debug -DJSON_BuildTests=On
+      env:
+        CC:   gcc-10
+        CXX:  g++-10
     - name: build
       run: cmake --build build --parallel 10
     - name: test
diff --git a/.travis.yml b/.travis.yml
index c671e93..f48ee1f 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -300,16 +300,6 @@
         sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-trusty-7']
         packages: ['g++-7', 'clang-7', 'ninja-build']
 
-  - os: linux
-    compiler: clang
-    env:
-      - COMPILER=clang++-7
-      - CXX_STANDARD=20
-    addons:
-      apt:
-        sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-trusty-7']
-        packages: ['g++-7', 'clang-7', 'ninja-build']
-
 ################
 # build script #
 ################
diff --git a/include/nlohmann/detail/iterators/iter_impl.hpp b/include/nlohmann/detail/iterators/iter_impl.hpp
index b4faa88..6c65c60 100644
--- a/include/nlohmann/detail/iterators/iter_impl.hpp
+++ b/include/nlohmann/detail/iterators/iter_impl.hpp
@@ -393,7 +393,30 @@
     @brief  comparison: equal
     @pre The iterator is initialized; i.e. `m_object != nullptr`.
     */
-    bool operator==(const iter_impl& other) const
+    bool operator==(const iter_impl<const BasicJsonType>& other) const
+    {
+        // if objects are not the same, the comparison is undefined
+        if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object))
+        {
+            JSON_THROW(invalid_iterator::create(212, "cannot compare iterators of different containers"));
+        }
+
+        JSON_ASSERT(m_object != nullptr);
+
+        switch (m_object->m_type)
+        {
+            case value_t::object:
+                return (m_it.object_iterator == other.m_it.object_iterator);
+
+            case value_t::array:
+                return (m_it.array_iterator == other.m_it.array_iterator);
+
+            default:
+                return (m_it.primitive_iterator == other.m_it.primitive_iterator);
+        }
+    }
+
+    bool operator==(const iter_impl<typename std::remove_const<BasicJsonType>::type>& other) const
     {
         // if objects are not the same, the comparison is undefined
         if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object))
diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp
index 765eac8..ac0568c 100644
--- a/single_include/nlohmann/json.hpp
+++ b/single_include/nlohmann/json.hpp
@@ -11279,7 +11279,30 @@
     @brief  comparison: equal
     @pre The iterator is initialized; i.e. `m_object != nullptr`.
     */
-    bool operator==(const iter_impl& other) const
+    bool operator==(const iter_impl<const BasicJsonType>& other) const
+    {
+        // if objects are not the same, the comparison is undefined
+        if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object))
+        {
+            JSON_THROW(invalid_iterator::create(212, "cannot compare iterators of different containers"));
+        }
+
+        JSON_ASSERT(m_object != nullptr);
+
+        switch (m_object->m_type)
+        {
+            case value_t::object:
+                return (m_it.object_iterator == other.m_it.object_iterator);
+
+            case value_t::array:
+                return (m_it.array_iterator == other.m_it.array_iterator);
+
+            default:
+                return (m_it.primitive_iterator == other.m_it.primitive_iterator);
+        }
+    }
+
+    bool operator==(const iter_impl<typename std::remove_const<BasicJsonType>::type>& other) const
     {
         // if objects are not the same, the comparison is undefined
         if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object))
diff --git a/test/src/unit-class_parser.cpp b/test/src/unit-class_parser.cpp
index d0335c9..c612daa 100644
--- a/test/src/unit-class_parser.cpp
+++ b/test/src/unit-class_parser.cpp
@@ -509,7 +509,7 @@
                 CHECK(parser_helper("\"€\"").get<json::string_t>() == "€");
                 CHECK(parser_helper("\"🎈\"").get<json::string_t>() == "🎈");
 
-                CHECK(parser_helper("\"\\ud80c\\udc60\"").get<json::string_t>() == u8"\U00013060");
+                CHECK(parser_helper("\"\\ud80c\\udc60\"").get<json::string_t>() == "\U00013060");
                 CHECK(parser_helper("\"\\ud83c\\udf1e\"").get<json::string_t>() == "🌞");
             }
         }
diff --git a/test/src/unit-items.cpp b/test/src/unit-items.cpp
index 10621ce..4caf76f 100644
--- a/test/src/unit-items.cpp
+++ b/test/src/unit-items.cpp
@@ -1448,3 +1448,11 @@
         }
     }
 }
+
+#ifdef JSON_HAS_CPP_17
+    #undef JSON_HAS_CPP_17
+#endif
+
+#ifdef JSON_HAS_CPP_14
+    #undef JSON_HAS_CPP_14
+#endif
diff --git a/test/src/unit-regression1.cpp b/test/src/unit-regression1.cpp
index 9dcc75b..f552005 100644
--- a/test/src/unit-regression1.cpp
+++ b/test/src/unit-regression1.cpp
@@ -400,7 +400,7 @@
 
     SECTION("issue #146 - character following a surrogate pair is skipped")
     {
-        CHECK(json::parse("\"\\ud80c\\udc60abc\"").get<json::string_t>() == u8"\U00013060abc");
+        CHECK(json::parse("\"\\ud80c\\udc60abc\"").get<json::string_t>() == "\U00013060abc");
     }
 
     SECTION("issue #171 - Cannot index by key of type static constexpr const char*")
diff --git a/test/src/unit-udt.cpp b/test/src/unit-udt.cpp
index 7f74ac5..b237655 100644
--- a/test/src/unit-udt.cpp
+++ b/test/src/unit-udt.cpp
@@ -112,13 +112,13 @@
     switch (c)
     {
         case country::china:
-            j = u8"中华人民共和国";
+            j = "中华人民共和国";
             return;
         case country::france:
             j = "France";
             return;
         case country::russia:
-            j = u8"Российская Федерация";
+            j = "Российская Федерация";
             return;
         default:
             break;
@@ -201,9 +201,9 @@
     const auto str = j.template get<std::string>();
     static const std::map<std::string, country> m =
     {
-        {u8"中华人民共和国", country::china},
+        {"中华人民共和国", country::china},
         {"France", country::france},
-        {u8"Российская Федерация", country::russia}
+        {"Российская Федерация", country::russia}
     };
 
     const auto it = m.find(str);
@@ -248,7 +248,7 @@
     const udt::name n{"theo"};
     const udt::country c{udt::country::france};
     const udt::person sfinae_addict{a, n, c};
-    const udt::person senior_programmer{{42}, {u8"王芳"}, udt::country::china};
+    const udt::person senior_programmer{{42}, {"王芳"}, udt::country::china};
     const udt::address addr{"Paris"};
     const udt::contact cpp_programmer{sfinae_addict, addr};
     const udt::contact_book book{{"C++"}, {cpp_programmer, {senior_programmer, addr}}};
@@ -265,14 +265,14 @@
 
         CHECK(
             json(book) ==
-            u8R"({"name":"C++", "contacts" : [{"person" : {"age":23, "name":"theo", "country":"France"}, "address":"Paris"}, {"person" : {"age":42, "country":"中华人民共和国", "name":"王芳"}, "address":"Paris"}]})"_json);
+            R"({"name":"C++", "contacts" : [{"person" : {"age":23, "name":"theo", "country":"France"}, "address":"Paris"}, {"person" : {"age":42, "country":"中华人民共和国", "name":"王芳"}, "address":"Paris"}]})"_json);
 
     }
 
     SECTION("conversion from json via free-functions")
     {
         const auto big_json =
-            u8R"({"name":"C++", "contacts" : [{"person" : {"age":23, "name":"theo", "country":"France"}, "address":"Paris"}, {"person" : {"age":42, "country":"中华人民共和国", "name":"王芳"}, "address":"Paris"}]})"_json;
+            R"({"name":"C++", "contacts" : [{"person" : {"age":23, "name":"theo", "country":"France"}, "address":"Paris"}, {"person" : {"age":42, "country":"中华人民共和国", "name":"王芳"}, "address":"Paris"}]})"_json;
         SECTION("via explicit calls to get")
         {
             const auto parsed_book = big_json.get<udt::contact_book>();