Разрешено ли это делать только компиляторам?
Точно. Вот почему он называется скрытым: это то, что компилятор делает от вашего имени, но это скрыто от кода C ++, который его использует.
Компилятор должен каким-то образом передать указатель this
на функцию-член, но ему не нужно рассказывать, как он это делает. Он может скомпилировать код, эквивалентный MyClass::getVar(&obj)
, передав указатель this
так же, как он передал бы аргумент для C функции free(foo)
. Или он может использовать другой механизм, который полностью несовместим с передачей аргументов, не являющихся членами. То, что он делает под капотом, определяется стандартом Abstract Binary Interface (ABI) платформы, который не является частью стандарта языка C ++. То, что происходит в Windows, может значительно отличаться от того, что происходит в Linux, и Linux в ARM может отличаться от Linux в X86 и т. Д. c.
Тем не менее, вы можете взгляните на то, что на самом деле происходит, сказав компилятору создать код сборки. Для gcc
значение заклинания будет
g++ -S -Os interestingCode.cpp
. В результате будет получен файл .s
, который содержит, как g++
фактически перевел ваш код.