diff --git a/src/corelib/tools/qstringview.h b/src/corelib/tools/qstringview.h index 5384e73039..b1722e4657 100644 --- a/src/corelib/tools/qstringview.h +++ b/src/corelib/tools/qstringview.h @@ -111,6 +111,9 @@ private: template using if_compatible_string = typename std::enable_if::value, bool>::type; + template + using if_compatible_qstring_like = typename std::enable_if::value || std::is_same::value, bool>::type; + template static Q_DECL_RELAXED_CONSTEXPR size_type lengthHelper(const Char *str) Q_DECL_NOTHROW { @@ -133,20 +136,6 @@ private: static Q_DECL_CONSTEXPR const storage_type *castHelper(const storage_type *str) Q_DECL_NOTHROW { return str; } - // prevent - // T t; QStringView sv(t), T \in {QChar, QLatin1String, QByteArray, const char*} - // from compiling as QStringView sv(QString(t)): - QStringView(QChar) = delete; - QStringView(QLatin1String) = delete; - QStringView(const QByteArray &) = delete; - QStringView(const char *) = delete; - -#ifdef Q_OS_WIN - // prevent QStringView(Char), Char compatible, from compiling due to: - // https://connect.microsoft.com/VisualStudio/feedback/details/2256407/c-two-user-defined-conversions-incorrectly-accepted-in-implicit-conversion-sequence - template = true> - QStringView(Char) = delete; -#endif public: Q_DECL_CONSTEXPR QStringView() Q_DECL_NOTHROW : m_size(0), m_data(nullptr) {} @@ -166,10 +155,14 @@ public: Q_DECL_CONSTEXPR QStringView(const Char *str) : QStringView(str, str ? lengthHelper(str) : 0) {} - QStringView(const QString &str) Q_DECL_NOTHROW - : QStringView(str.isNull() ? nullptr : str.data(), size_type(str.size())) {} - QStringView(const QStringRef &str) Q_DECL_NOTHROW +#ifdef Q_QDOC + QStringView(const QString &str) Q_DECL_NOTHROW; + QStringView(const QStringRef &str) Q_DECL_NOTHROW; +#else + template = true> + QStringView(const String &str) Q_DECL_NOTHROW : QStringView(str.isNull() ? nullptr : str.data(), size_type(str.size())) {} +#endif template = true> QStringView(const StdBasicString &str) Q_DECL_NOTHROW diff --git a/tests/auto/corelib/tools/qstringview/tst_qstringview.cpp b/tests/auto/corelib/tools/qstringview/tst_qstringview.cpp index 2e671040dc..3154e5ec9d 100644 --- a/tests/auto/corelib/tools/qstringview/tst_qstringview.cpp +++ b/tests/auto/corelib/tools/qstringview/tst_qstringview.cpp @@ -43,10 +43,21 @@ template using CanConvert = std::is_convertible; +Q_STATIC_ASSERT(!CanConvert::value); +Q_STATIC_ASSERT(!CanConvert::value); +Q_STATIC_ASSERT(!CanConvert::value); + +// QStringView qchar_does_not_compile() { return QStringView(QChar('a')); } +// QStringView qlatin1string_does_not_compile() { return QStringView(QLatin1String("a")); } +// QStringView const_char_star_does_not_compile() { return QStringView("a"); } +// QStringView qbytearray_does_not_compile() { return QStringView(QByteArray("a")); } + // // QChar // +Q_STATIC_ASSERT(!CanConvert::value); + Q_STATIC_ASSERT(CanConvert< QString >::value); Q_STATIC_ASSERT(CanConvert::value); Q_STATIC_ASSERT(CanConvert< QString&>::value); @@ -62,6 +73,8 @@ Q_STATIC_ASSERT(CanConvert::value); // ushort // +Q_STATIC_ASSERT(!CanConvert::value); + Q_STATIC_ASSERT(CanConvert< ushort*>::value); Q_STATIC_ASSERT(CanConvert::value); @@ -72,6 +85,8 @@ Q_STATIC_ASSERT(CanConvert::value); #if !defined(Q_OS_WIN) || defined(Q_COMPILER_UNICODE_STRINGS) +Q_STATIC_ASSERT(!CanConvert::value); + Q_STATIC_ASSERT(CanConvert< char16_t*>::value); Q_STATIC_ASSERT(CanConvert::value); @@ -99,6 +114,8 @@ Q_CONSTEXPR bool CanConvertFromWCharT = #endif ; +Q_STATIC_ASSERT(!CanConvert::value); + Q_STATIC_ASSERT(CanConvert< wchar_t*>::value == CanConvertFromWCharT); Q_STATIC_ASSERT(CanConvert::value == CanConvertFromWCharT);