В this
указатель [class.this], стандарт C ++ гласит:
Тип
this
в функции члена
классX
являетсяX*
.
то есть this
не является const
, Но почему тогда это
struct M {
M() { this = new M; }
};
дает
error: invalid lvalue in assignment <-- gcc
'=' : left operand must be l-value <-- VC++
'=' : left operand must be l-value <-- clang++
'=' : left operand must be l-value <-- ICC
(source: some online compiler frontends)
Другими словами, this
не является const
, но это действительно так!
Потому что в том же пункте также упоминается, что this
это prvalue
(«чистое значение»).
Примеры, упомянутые в стандарте для чистого значения rvalue, являются результатом вызова функции, которая не возвращает ссылку, или литералов, подобных 1
, true
или же 3.5f
, this
-pointer не является переменной, это больше похоже на литерал, который расширяется до адрес объекта, для которого вызывается функция ([Class.this]). И, например, как буквальный true
имеет тип bool
а также не bool const
, this
имеет тип X*
а также не X*const
,
Других решений пока нет …