[Development] Should qMetaTypeId<const T>() == qMetaTypeId<T>()?
Olivier Goffart
olivier at woboq.com
Wed Aug 31 10:46:42 CEST 2016
On Mittwoch, 31. August 2016 08:00:53 CEST Jedrzej Nowacki wrote:
> I love to be proven wrong, but this time I would not call it easy [?] Try
> this:
We were talking about "T" vs. "const T"; not "T *" vs "const T *".
So in your example you should compare "F *" and "F * const"
The question whether F* and const F* should have the same metatype is another
question worth asking. Since their normalized type does not compare the same
anyway, i guess it's ok if they are different.
>
>
> struct F{};
> Q_DECLARE_METATYPE(F*);
> Q_DECLARE_METATYPE(const F*);
> Q_DECLARE_METATYPE(F);
> // Q_DECLARE_METATYPE(const F); doesn't compile, that is a bug!
>
> class O : public QObject
> {
> Q_OBJECT
> signals:
> void foo1(const F*);
> void foo2(F*);
> };
>
> int main(int argc, char **argv) {
> qDebug() << QMetaMethod::fromSignal(&O::foo1).methodSignature();
> qDebug() << QMetaMethod::fromSignal(&O::foo2).methodSignature();
> return 0;
> }
>
>
>
> ________________________________
> From: Development <development-bounces+jedrzej.nowacki=qt.io at qt-project.org>
> on behalf of Olivier Goffart <olivier at woboq.com> Sent: Saturday, August 27,
> 2016 9:30:21 AM
> To: development at qt-project.org
> Subject: Re: [Development] Should qMetaTypeId<const T>() ==
> qMetaTypeId<T>()?
> On Mittwoch, 24. August 2016 16:06:50 CEST J?drzej Nowacki wrote:
> > On onsdag 24. august 2016 15.23.01 CEST Marc Mutz wrote:
> > > Hi,
> > >
> > > Currently, it's not, which doesn't make much sense, does it?
> > >
> > > So,
> > >
> > > template <typename T>
> > > int qMetyTypeId<T>() {
> > >
> > > return qMetaTypeIdHelper<typename std::remove_cv<T>::type>();
> > >
> > > }
> > >
> > > ?
> > >
> > > (There's of course a lot more involved in this, registration should
> > > discard const, too, e.g.).
>
> I think it make sens, but it should be done at the QMetaTypeId2 Level.
> We already do this for const T&, See commit
> 03b25125986f083a260b421abeed1f1d088d27b3
> In fact, the same should be done for const T
>
> > From C++ perspective const T and T are kind of separate types, metatype
> > mimics that. QMetaType is used in many places and in some constness
> > matters.
> >
> > Consider that example:
> > QMetaType::typeName(qMetaTypeId<const QString>())
> >
> > and
> >
> > QMetaType::typeName(qMetaTypeId<QString>())
> >
> > The function is used in metaobject to compute signatures of invokables.
>
> I can prove you wrong easily, both have the same result, since
> QMetaType::normalizedType("const QString") == "QString"
>
> They are different C++ type, yes, but from a practical purpose, their use
> in the metatype system is exactly the same. You allocate, destroy or copy
> a const QString the same way you do a QString.
>
> --
> Olivier
>
> Woboq - Qt services and support - https://woboq.com - https://code.woboq.org
> _______________________________________________
> Development mailing list
> Development at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/development
More information about the Development
mailing list