Во-первых, имейте в виду, что оператор ->
для auto_ptr
по существу перенаправляется на содержащийся указатель. Итак, для этого обсуждения ваш код в main
становится эквивалентным:
MyClass* ptr = NULL;
cout << ptr->solution() << endl;
Затем обратите внимание, что компиляторы имеют тенденцию реализовывать функции-члены способами, которые действуют очень похоже на то, как если бы они были функциями, не являющимися членами, с указателем this
, переданным в качестве другого аргумента функции. Таким образом, с точки зрения вашего текущего компилятора, ваш код в main
действует так, как если бы он был:
MyClass* ptr = NULL;
cout << solution(ptr) << endl;
с решением, записанным как:
int solution(MyClass* this) { return 42; }
В этом случае становится очевидным, почему не произошло крушения.
Однако, как уже упоминали другие, это внутренние детали того, как компиляторы реализуют C ++, которые не определены стандартом языка. Таким образом, теоретически этот код может работать, как описано здесь, на одном компиляторе, но аварийно завершать работу или делать что-то другое полностью на другом компиляторе.
Но на практике, даже если стандарт не гарантирует такое поведение, любой конкретный компилятор может гарантировать его, если захочет. Например: поскольку MFC использует это поведение, маловероятно, что Visual Studio когда-либо перестанет его поддерживать. Конечно, вам придется исследовать каждый конкретный компилятор, где может использоваться ваш код, чтобы убедиться, что он действительно гарантирует такое поведение.