Should the following sample compile?
struct B;
struct A
{
A(B*&&){}
};
struct B : A
{
B() : A(this){}
};
int main(){}
On LWS with clang it compiles, but with gcc I get:
no known conversion for argument 1 from 'B* const' to 'B*&&'
and if I add a const
it compiles.
I would like to also point out MSVC gets it wrong too:
cannot convert parameter 2 from 'B *const ' to 'B *&&'
so it looks like we have a bug in two compilers.
BUGS FILED
MSVC bug link
GCC bug link
Yes, that should compile.
It is incorrect to implement this
as cv T* const
(where cv is the cv-qualifiers for the function, if any, and T
is the class type). this
is not const
, merely a prvalue expression of a built-in type (not modifiable).
Many people think that because you can't modify this
it must be const
, but as Johannes Schaub - litb once commented long ago, a much better explanation is something like this:
// by the compiler
#define this (__this + 0)
// where __this is the "real" value of this
Here it's clear that you can't modify this
(say, this = nullptr
), but also clear no const
is necessary for such an explanation. (And the value you have in your constructor is just the value of the temporary.)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With