-
@Engelard said in Why no std::byte in qt?!!:
In vs i had
using namespace std;for nicer code. But in Qt i forgot about that.
And thats one of the reasons I don't use
using namespaceat least globaly for a class, one should always be certain what one is actually referencing/usingThat makes me also a non user of
auto, if I can avoid it. -
@J.Hilk Hey, I don't like auto that much as well.
This is a constant source of discussions in our team :-)
In some cases it's OK, but some people overuse it and it becomes more difficult to understand the code.if you have some ridiculously long Class names whom you need an instance of, lets say:
auto agent = new QBluetoothDeviceDiscoveryAgent();I can see a justified use, you see the return type on the first glance and its really long class name, so it's more readable and it saves time (somewhat) so use it here.
and than you have something along this line
auto a = ConjureMagic(); SetMagic(a);and I'm like, NO!
-
if you have some ridiculously long Class names whom you need an instance of, lets say:
auto agent = new QBluetoothDeviceDiscoveryAgent();I can see a justified use, you see the return type on the first glance and its really long class name, so it's more readable and it saves time (somewhat) so use it here.
and than you have something along this line
auto a = ConjureMagic(); SetMagic(a);and I'm like, NO!
-
@J.Hilk Sure.
One example for what I don't like: you have a function/method returning something and when you write:auto ret = someFunction();What type is ret?
-
@J.Hilk Sure.
One example for what I don't like: you have a function/method returning something and when you write:auto ret = someFunction();What type is ret?
@jsulm @J-Hilk
And there's the occasional case that you can actually get wrong behaviour using such nonsense:
https://eigen.tuxfamily.org/dox/TopicPitfalls.html -
We are going a lot off topic here but
autois not as evil as everybody thinks.
It does not prevent you from hard typing, you can always put it on the right side of the equal with no difference in the compiled code.
It also prevent implicit conversionint ret = someFunction();with somefunction returning a double introduces a truncation that would have been avoided withauto, this is also the reason why Eigen doesn't likeauto, they rely on implicit conversions to delay the calculations to the last minute to increase efficiency.What I'm saying is that
autois a tool, a useful one. It shouldn't be hated and the usage proposed by the coding conventions of Qt is more than reasonable.In layman's terms: you can use a wrench to kill a man but that doesn't make the wrench dangerous or useless. Same goes for
auto -
We are going a lot off topic here but
autois not as evil as everybody thinks.
It does not prevent you from hard typing, you can always put it on the right side of the equal with no difference in the compiled code.
It also prevent implicit conversionint ret = someFunction();with somefunction returning a double introduces a truncation that would have been avoided withauto, this is also the reason why Eigen doesn't likeauto, they rely on implicit conversions to delay the calculations to the last minute to increase efficiency.What I'm saying is that
autois a tool, a useful one. It shouldn't be hated and the usage proposed by the coding conventions of Qt is more than reasonable.In layman's terms: you can use a wrench to kill a man but that doesn't make the wrench dangerous or useless. Same goes for
auto@VRonin said in Why no std::byte in qt?!!:
We are going a lot off topic here
Seeing as the topic is pretty much done, I'd say we are not that much into sin. You can fork it off if you think appropriate, though.
but
autois not as evil as everybody thinks.Eh, okay. Defining it as just a little bit evil I can accept.
It does not prevent you from hard typing, you can always put it on the right side of the equal with no difference in the compiled code.
Yep, it's still hard typed only hidden hard typing, a.k.a. compiler deduced typing.
It also prevent implicit conversion
int ret = someFunction();with somefunction returning a double introduces a truncation that would have been avoided withautoWhich you should've caught by compiling with pedantic, as is (somewhat) customary for release builds, provided this is not what you intended to begin with.
this is also the reason why Eigen doesn't like
auto, they rely on implicit conversions to delay the calculations to the last minute to increase efficiency.Rather it relies on overloading and implicit constructors, which is completely valid thing to do. Also had been in the language long before they decided that C++ should behave like javascript but compiled.
What I'm saying is that
autois a tool, a useful one.Sure! A cannon is a tool too, but you don't go around smashing bugs with it, right?
It shouldn't be hated and the usage proposed by the coding conventions of Qt is more than reasonable.
Agreed. Although that convention just says we can take a (safe) shortcut in some very specific places, and specifically warns against using it whenever there's a spec of doubt about readability. So all uses of the type:
auto IAmBothTooSmartToKnowDocsByHeartAndUtterlyLazyToWriteTheType = myObject.someFunctionThatReturnsGodKnowsWhat();is simply a no-no.
In layman's terms: you can use a wrench to kill a man but that doesn't make the wrench dangerous or useless. Same goes for
autoIndeed, there's also the gun, which you can use to kill a man, and it is dangerous and pretty much useless (beside it's primary purpose).
-
@VRonin said in Why no std::byte in qt?!!:
We are going a lot off topic here
Seeing as the topic is pretty much done, I'd say we are not that much into sin. You can fork it off if you think appropriate, though.
but
autois not as evil as everybody thinks.Eh, okay. Defining it as just a little bit evil I can accept.
It does not prevent you from hard typing, you can always put it on the right side of the equal with no difference in the compiled code.
Yep, it's still hard typed only hidden hard typing, a.k.a. compiler deduced typing.
It also prevent implicit conversion
int ret = someFunction();with somefunction returning a double introduces a truncation that would have been avoided withautoWhich you should've caught by compiling with pedantic, as is (somewhat) customary for release builds, provided this is not what you intended to begin with.
this is also the reason why Eigen doesn't like
auto, they rely on implicit conversions to delay the calculations to the last minute to increase efficiency.Rather it relies on overloading and implicit constructors, which is completely valid thing to do. Also had been in the language long before they decided that C++ should behave like javascript but compiled.
What I'm saying is that
autois a tool, a useful one.Sure! A cannon is a tool too, but you don't go around smashing bugs with it, right?
It shouldn't be hated and the usage proposed by the coding conventions of Qt is more than reasonable.
Agreed. Although that convention just says we can take a (safe) shortcut in some very specific places, and specifically warns against using it whenever there's a spec of doubt about readability. So all uses of the type:
auto IAmBothTooSmartToKnowDocsByHeartAndUtterlyLazyToWriteTheType = myObject.someFunctionThatReturnsGodKnowsWhat();is simply a no-no.
In layman's terms: you can use a wrench to kill a man but that doesn't make the wrench dangerous or useless. Same goes for
autoIndeed, there's also the gun, which you can use to kill a man, and it is dangerous and pretty much useless (beside it's primary purpose).
@kshegunov said in Why no std::byte in qt?!!:
Rather it relies on overloading and implicit constructors
Yes, I probably I over simplified my terminology, I was thinking at implicit constructors as well as implicit conversions.
Probably a better example is
someFunctionreturns aQByteArrayand people writeQString ret = someFunction();(I'm looking at you,QIODevice::readAll) even when they have no assurance the returned value is a UTF-8 encoded string. usingautowould forceretto beQByteArrayand it's also far more efficient.I agree this is a corner case and I'm the first not to advocate a too libertine use of
auto, just pointing out that it's a point of view.Rather it relies on overloading and implicit constructors, which is completely valid thing to do.
I actually think it's a very smart way of handling and compressing intensive calculations, nevertheless now that
autois a thing users must be aware of this implementation detail more than ever -
@kshegunov said in Why no std::byte in qt?!!:
Rather it relies on overloading and implicit constructors
Yes, I probably I over simplified my terminology, I was thinking at implicit constructors as well as implicit conversions.
Probably a better example is
someFunctionreturns aQByteArrayand people writeQString ret = someFunction();(I'm looking at you,QIODevice::readAll) even when they have no assurance the returned value is a UTF-8 encoded string. usingautowould forceretto beQByteArrayand it's also far more efficient.I agree this is a corner case and I'm the first not to advocate a too libertine use of
auto, just pointing out that it's a point of view.Rather it relies on overloading and implicit constructors, which is completely valid thing to do.
I actually think it's a very smart way of handling and compressing intensive calculations, nevertheless now that
autois a thing users must be aware of this implementation detail more than ever@VRonin said in Why no std::byte in qt?!!:
Probably a better example is someFunction returns a QByteArray and people write QString ret = someFunction(); (I'm looking at you, QIODevice::readAll) even when they have no assurance the returned value is a UTF-8 encoded string. using auto would force ret to be QByteArray and it's also far more efficient.
I have only one thing to say here:
QT_NO_CAST_FROM_ASCII;)@VRonin said in Why no std::byte in qt?!!:
I actually think it's a very smart way of handling and compressing intensive calculations, nevertheless now that auto is a thing users must be aware of this implementation detail more than ever
I agree on both counts.
-
My 2¢: when you have
MyRidiculouslyLongClassNameWhichIDontWantToTypeInEachTimeSoIUseEvilAuto, trytypedef MyRidiculouslyLongClassNameWhichIDontWantToTypeInEachTimeSoIUseEvilAuto Z; Z abc;:)
-
@JonB First of all
using Z = MyRidiculouslyLongClassNameWhichIDontWantToTypeInEachTimeSoIUseEvilAuto;because C++11 :)@VRonin
Sigh, looks like my C knowledge is increasingly invalid :( But I don't see what's wrong withtypedefhere, I'm not using a template.
BTW, I wouldn't really name itZhere, of course I'd useMRLCNWIDWTTIETSIUEAbecause it's much clearer what that means! -
@VRonin
Sigh, looks like my C knowledge is increasingly invalid :( But I don't see what's wrong withtypedefhere, I'm not using a template.
BTW, I wouldn't really name itZhere, of course I'd useMRLCNWIDWTTIETSIUEAbecause it's much clearer what that means! -
@JonB said in Rants about auto:
But I don't see what's wrong with
typedefhereNothing, I was just taking the piss. they are equivalent with the only difference that the
Ztype can be a template withusingwhile it can't withtypedef.@VRonin
Oh, lol! Once I started reading up about this newusingI suspected that now I was supposed to use that every time....With
typedefs you can string them together for a nice extra level of confusion ;) So you writetypedef int I, *PI;which makes me wonder: without you looking it up, if I write:
typedef int *PI, T;is
Ttypeintorint *? :) -
@VRonin
Oh, lol! Once I started reading up about this newusingI suspected that now I was supposed to use that every time....With
typedefs you can string them together for a nice extra level of confusion ;) So you writetypedef int I, *PI;which makes me wonder: without you looking it up, if I write:
typedef int *PI, T;is
Ttypeintorint *? :) -
@kshegunov
Hmm. OK, then, could you please explain how the*binds intypedef int *PI, T;.Why is that
typedefnotint *forT? And if you wanted it to bind asint *forT(i.e. making it same asPI), how could you force that, e.g. something like (I'm sure it's not right):typedef (int *)PI, TP.S.
We are not JS devs, you know
Ummm, relevance? JS doesn't even have type declarations or pointers, so...?
-
@kshegunov
Hmm. OK, then, could you please explain how the*binds intypedef int *PI, T;.Why is that
typedefnotint *forT? And if you wanted it to bind asint *forT(i.e. making it same asPI), how could you force that, e.g. something like (I'm sure it's not right):typedef (int *)PI, TP.S.
We are not JS devs, you know
Ummm, relevance? JS doesn't even have type declarations or pointers, so...?
@JonB said in Rants about auto:
Why is that typedef not int * for T?
Not 100% about the theory behind it, but it's like with initialization (I assume it's cause
,has very low priority). Say you have:char * p, n;pischar *, butnischar.And if you wanted it to bind as int * for T (i.e. making it same as PI), how could you force that, e.g. something like (I'm sure it's not right):
typedef int *PI, *T;Ummm, relevance? JS doesn't even have type declarations or pointers, so...?
Simply an ill-concealed insult. :)
PS:
Simply an ill-concealed insult.
-
@JonB said in Rants about auto:
Why is that typedef not int * for T?
Not 100% about the theory behind it, but it's like with initialization (I assume it's cause
,has very low priority). Say you have:char * p, n;pischar *, butnischar.And if you wanted it to bind as int * for T (i.e. making it same as PI), how could you force that, e.g. something like (I'm sure it's not right):
typedef int *PI, *T;Ummm, relevance? JS doesn't even have type declarations or pointers, so...?
Simply an ill-concealed insult. :)
PS:
Simply an ill-concealed insult.
typedef int *PI, *T;That is cheating! You know it. You know that I know it can be done that way, that wasn't the question. I want the
*s to be included in the "base" part of thetypedefI am declaring, so that I can write like:typedef (int **********) PI, PI2_same_as_PI, *PI3_one_extra_pointer;I don't want to repeat the
*s, and I don't want to declare a separate, intermediatetypedefto achieve it.As you say, thinking about the
typedefjust like a list-of-variables declaration, I guess it cannot be done? The*s just aren't a part of the "base" type being declared, they belong only to each type-name/variable being declared individually? And this is why we tend/are encouraged to writechar *pand notchar* pin C.As for the JS. I know I am a cheerleader for C compared to C++, but I have never said I am a fanboi for all the JS stuff I have had to write over the years.
-
typedef int *PI, *T;That is cheating! You know it. You know that I know it can be done that way, that wasn't the question. I want the
*s to be included in the "base" part of thetypedefI am declaring, so that I can write like:typedef (int **********) PI, PI2_same_as_PI, *PI3_one_extra_pointer;I don't want to repeat the
*s, and I don't want to declare a separate, intermediatetypedefto achieve it.As you say, thinking about the
typedefjust like a list-of-variables declaration, I guess it cannot be done? The*s just aren't a part of the "base" type being declared, they belong only to each type-name/variable being declared individually? And this is why we tend/are encouraged to writechar *pand notchar* pin C.As for the JS. I know I am a cheerleader for C compared to C++, but I have never said I am a fanboi for all the JS stuff I have had to write over the years.
@JonB said in Rants about auto:
I don't want to repeat the *s, and I don't want to declare a separate, intermediate typedef to achieve it.
Then you're out of luck.
And this is why we tend/are encouraged to write
That's just style. I write spaces on both sides:
char * p; char ** p;and so on.
I know I am a cheerleader for C compared to C++
That's like being cheerleader for FORTRAN against C. ;)
but I have never said I am a fanboi for all the JS stuff I have had to write over the years.
Granted. I was just making fun of JS devs. ;P
-
@JonB said in Rants about auto:
I don't want to repeat the *s, and I don't want to declare a separate, intermediate typedef to achieve it.
Then you're out of luck.
And this is why we tend/are encouraged to write
That's just style. I write spaces on both sides:
char * p; char ** p;and so on.
I know I am a cheerleader for C compared to C++
That's like being cheerleader for FORTRAN against C. ;)
but I have never said I am a fanboi for all the JS stuff I have had to write over the years.
Granted. I was just making fun of JS devs. ;P
@kshegunov
The declaration layout is just style, but I meant thatchar *pinstead ofchar* pmakes clear how C type declarations with*actually bind, relevant if you have a list of them (char *p, *qbetter thanchar* p, *q).
Qt 6.11 is out! See what's new in the release
blog