Hello,
I've been now working for a while with literals that have to (eventually) be
converted to QString one way or another. While in certain cases (e.g. myMsg ==
u"This is my message" or u"Hello, " + world) character literals are handled
neatly by some underlying machinery, pure assignments just don't work well:
QString hello = u"Hello"; // oops, compilation error
There's an explicit ctor that accepts QChar*, but if you end up with it,
QString would allocate a memory to store whatever QChar* points to. Same is
true for QString::fromUtf16().
There's QStringView (and friends) which may aid you, but what if there's a list
of strings that is populated? QList<QStringView> is not really an option if
half of the strings are not literals. Then the next choice is QStringList in
which case you need to do QStringView::toString() - well, bad luck, you end up
allocating memory again.
There's of course QStringLiteral:
QString hello = QStringLiteral("Hello"); // yay, it works
... and, actually, QStringLiteral in Qt 6 is great, because it doesn't allocate
the memory* to store that literal.
But writing "QStringLiteral" each time is a bit inconvenient: let's be honest,
it's a lot of code to type. You may want to write it once or twice, but how
about a fifty or a hundred times?
* unless you modify the resulting string, of course
---
Here's my proposal: let's introduce a user-defined literal [1] for QString (and
I volunteer to do it).
How this would look for a user: instead of typing QStringLiteral("Hello") you
would have something like u"Hello"_q. And the new code of course behaves
exactly like the QStringLiteral()
Well, to be good citizens, we probably need to scope the user-defined literal
(e.g. similarly to std::chrono_literals [2]). Given that, how you would really
write your code is similar to:
using namespace <whatever>; // done only once in a .cpp file
u"Hello"_q; // "u" in front and suffix "_q" are written every time
This is the proposal in a nutshell. I'd like to have some feedback and then
some suggestions regarding:
* Whether we want this for QByteArray as well (similarly to QString it
allows "from raw data" construction, but then it's not really a string class,
is it?)
* What suffix to use: in the example above I used "_q", but maybe "_qs" is
better or something totally different
* How to call a namespace: I'd probably go with "QtLiterals" but (looking
at [2]) maybe there should be a richer hierarchy? For example,
"QtLiterals::StringLiterals", so that the suffix could be reused without
conflicts, etc.
* Whether *View classes need it (in theory they should allow implicit
construction, so probably not)
[1]: https://en.cppreference.com/w/cpp/language/user_literal
[2]: https://en.cppreference.com/w/cpp/symbol_index/chrono_literals
--
Best Regards,
Andrei
_______________________________________________
Development mailing list
[email protected]
https://lists.qt-project.org/listinfo/development