Метод, полностью определенный в определении класса, является в некотором роде встроенным. Если он не раскрывается непосредственно в строке, где он используется, он компилируется вне тела класса. Это волшебный соус, который позволяет методу видеть любые члены, которые были определены после него в классе.
Если он не используется, возможно, компилятор не смотрит на него достаточно глубоко, чтобы обнаружить ошибку. Возможно это не смотрит на это вообще. Может быть, это генерирует предупреждение, а может и нет. Это зависит от компилятора. Кажется, Visual Studio выбрала сообщение об отсутствующем операторе возврата как ошибку, но не проверяет неиспользуемую inline
(или как бы встроенную) функцию.
Путем изменения main
на
int main()
{
Simple obj;
obj.GetM();
}
Я могу заставить Visual Studio выдавать ошибку C4716 для gGetM
, поскольку теперь функция должна быть скомпилирована, встроена или нет.
Я тоже могу
inline int Simple::GetN() const
{
}
, чтобы явно сделать GetN
inline
и «устранить» ошибку.
Это все зависит от компилятора и, возможно, даже от опции компилятора.