REQUIRE does not compile when operator== in different namespace #443 . (#468)

* REQUIRE does not compile when operator== in different namespace #443 .
Expression_lhs.op member method is not instantiated when it is missing
a member operator and the user defined conversion is able to apply the
global operator.

* Removing utility and using an overloaded version of declval which is faster in doctest_fwd.h .

* Using templated operator== inside TEST_CASE changes deduced types of forwarding references #399 . This is fixed by using rvalues as function argument and using forward for the right type of reference. Now both gcc and doctest either fails or either compiles but not like one compiles and the other fails
diff --git a/examples/all_features/namespace7.cpp b/examples/all_features/namespace7.cpp
new file mode 100644
index 0000000..c2c2732
--- /dev/null
+++ b/examples/all_features/namespace7.cpp
@@ -0,0 +1,41 @@
+#include <doctest/doctest.h>
+
+DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN
+#include <cstdint>
+#include <sstream>
+DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_END
+
+namespace user6 {
+struct label
+{
+    label()
+            : i(0) {}
+    int  i;
+    bool operator==(const user6::label& rhs) const { return i == rhs.i; }
+};
+} // namespace user6
+
+namespace user7 {
+struct label
+{
+    label()
+            : i(0) {}
+    int i;
+};
+} // namespace user7
+
+DOCTEST_GCC_SUPPRESS_WARNING("-Wmissing-declarations")
+DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-prototypes")
+
+bool operator==(const user7::label& lhs, const user7::label& rhs) { return lhs.i == rhs.i; }
+
+TEST_CASE("namespace 7 member vs global") {
+    user6::label a6;
+    user6::label b6;
+
+    user7::label a7;
+    user7::label b7;
+
+    REQUIRE(a6 == b6);
+    REQUIRE(a7 == b7);
+}