[Development] How qAsConst and qExchange lead to qNN

Thiago Macieira thiago.macieira at intel.com
Thu Nov 10 20:27:19 CET 2022

On Thursday, 10 November 2022 10:40:35 PST Giuseppe D'Angelo via Development 
> On 09/11/2022 20:25, Thiago Macieira wrote:
> > Our API should default to passing QStrings for simplicity and not to
> > confuse> 
> > the user. The fact that I cannot wrote:
> >    foo(u"bar');
> > 
> > if foo takes a QString is MESSED UP.
> Is this because we deliberately didn't add a QString(const char16_t *)
> constructor, to prevent ambiguities in case we have overloads like these:
>    void f(QString)
>    void f(QStringView)
> ?

I think so. I understand why we did it. I just think it's wrong.

> (We end up with these overload sets because right now we have tons of
> f(QString), and we're slowly moving them to f(QStringView) if it does
> make sense for them. Due to the BC promise we can't just _remove_
> f(QString).)

And we shouldn't. So we shouldn't be moving to QStringView.

Where it's useful, we can use a Q_WEAK_OVERLOAD. But I insist that we only do 
that where there's a clear performance benefit. Otherwise, keep using QString.

> However: doesn't the new "removed API" system change the status quo? The
> point of the new system is to allow us to preserve BC, while always
> presenting only one of the two functions (the most recent) to client
> code. f(u"foo") would therefore still compile and don't incur in the
> ambiguity.
> (Surely, it's not 100% API compatible, but it would be a SIC A).

It might, indeed.

Thiago Macieira - thiago.macieira (AT) intel.com
  Cloud Software Architect - Intel DCAI Cloud Engineering

More information about the Development mailing list