QString: add missing char8_t* constructor / fromUtf8 overloads

Currently we support:

  QString s = QString::fromUtf(u8"foo", 3);

But we don't support

  QString s = QString::fromUtf8(u8"foo");
  QString s(u8"foo");

There's no reason not to have these two functions. Guess what,
we've actually got code _in Qt_ that tries to build a QString out of
a char8_t; that code stops compiling under C++20 (which is supported,
but not CI-tested at the moment, it seems).

Re-add the missing constructor and fromUtf8 overloads.

[ChangeLog][QtCore][QString] Added a constructor and a fromUtf8()
overload taking a `const char8_t *` argument.

Task-number: QTQAINFRA-4117
Task-number: QTQAINFRA-4242
Change-Id: I1f0ae658b3490b9e092941cabcc7fb8fc4c51aa3
Pick-to: 6.1.0 6.1
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
This commit is contained in:
Giuseppe D'Angelo 2021-04-15 14:31:46 +02:00
parent 8546e017c0
commit b322bfcc14
2 changed files with 27 additions and 0 deletions

View File

@ -2190,6 +2190,16 @@ inline char qToLower(char ch)
\sa fromLatin1(), fromLocal8Bit(), fromUtf8()
*/
/*! \fn QString::QString(const char8_t *str)
Constructs a string initialized with the UTF-8 string \a str. The
given const char8_t pointer is converted to Unicode using the
fromUtf8() function.
\since 6.1
\sa fromLatin1(), fromLocal8Bit(), fromUtf8()
*/
/*! \fn QString QString::fromStdString(const std::string &str)
Returns a copy of the \a str string. The given string is converted
@ -5324,6 +5334,14 @@ QString QString::fromLocal8Bit(QByteArrayView ba)
\sa toUtf8(), fromLatin1(), fromLocal8Bit()
*/
/*!
\fn QString QString::fromUtf8(const char8_t *str)
\overload
\since 6.1
This overload is only available when compiling in C++20 mode.
*/
/*!
\fn QString QString::fromUtf8(const char8_t *str, qsizetype size)
\overload

View File

@ -386,6 +386,12 @@ public:
QString(QChar c);
QString(qsizetype size, QChar c);
inline QString(QLatin1String latin1);
#if defined(__cpp_char8_t) || defined(Q_CLANG_QDOC)
Q_WEAK_OVERLOAD
inline QString(const char8_t *str)
: QString(fromUtf8(str))
{}
#endif
inline QString(const QString &) noexcept;
inline ~QString();
QString &operator=(QChar c);
@ -746,6 +752,9 @@ public:
return fromUtf8(QByteArrayView(utf8, !utf8 || size < 0 ? qstrlen(utf8) : size));
}
#if defined(__cpp_char8_t) || defined(Q_CLANG_QDOC)
Q_WEAK_OVERLOAD
static inline QString fromUtf8(const char8_t *str)
{ return fromUtf8(reinterpret_cast<const char *>(str)); }
Q_WEAK_OVERLOAD
static inline QString fromUtf8(const char8_t *str, qsizetype size)
{ return fromUtf8(reinterpret_cast<const char *>(str), size); }