Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Assigning this pointer to rvalue reference to a pointer

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

like image 386
Jesse Good Avatar asked Mar 21 '13 21:03

Jesse Good


1 Answers

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.)

like image 151
GManNickG Avatar answered Sep 23 '22 14:09

GManNickG