Подтвердить что ты не робот

Если `this` не const, почему я не могу его изменить?

В указателе this [class.this] в стандарте С++ указано:

Тип 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, но это действительно так!

4b9b3361

Ответ 1

Потому что в том же параграфе также упоминается, что this является prvalue ( "чистое значение" ).

Примеры, упомянутые в стандарте для чистого значения rvalue, являются результатом вызова функции, которая не возвращает ссылку, или литералов, таких как 1, true или 3.5f. this -pointer не является переменной, он больше похож на литерал, который расширяется до адреса объекта, для которого вызывается функция ([class.this]). И, как, например, literal true имеет тип bool, а не bool const, this имеет тип X* и не X*const.