VS2017 версия 15.8.3 успешно компилирует встроенный метод без возврата требуемого значения - PullRequest
0 голосов
/ 11 сентября 2018

Я скомпилировал следующий код с VS2017 версии 15.8.3. Уровень предупреждения установлен на /W4. Код содержит два простых метода получения, один из которых GetM() встроен.

Встроенный метод получения GetM() не имеет оператора return. Тем не менее, VS2017 успешно скомпилировал код без каких-либо предупреждений или ошибок.

Метод GetN() приведет к error C4716: 'Simple::GetN': must return a value, если его оператор return n; закомментирован.

class Simple
{
    int m = 0;
    int n = 0;

public:
    int GetM() const { /* No return here. */ }
    int GetN() const;
};

int Simple::GetN() const
{
    return n;
    // No return here results in compiler error below. 
    // error C4716: 'Simple::GetN': must return a value
}

int main()
{
    Simple obj;
}

Вопрос: должен ли компилятор также генерировать error C4716 для встроенного метода GetM()?

1 Ответ

0 голосов
/ 11 сентября 2018

Метод, полностью определенный в определении класса, является в некотором роде встроенным. Если он не раскрывается непосредственно в строке, где он используется, он компилируется вне тела класса. Это волшебный соус, который позволяет методу видеть любые члены, которые были определены после него в классе.

Если он не используется, возможно, компилятор не смотрит на него достаточно глубоко, чтобы обнаружить ошибку. Возможно это не смотрит на это вообще. Может быть, это генерирует предупреждение, а может и нет. Это зависит от компилятора. Кажется, Visual Studio выбрала сообщение об отсутствующем операторе возврата как ошибку, но не проверяет неиспользуемую inline (или как бы встроенную) функцию.

Путем изменения main на

int main()
{
    Simple obj;
    obj.GetM();
}

Я могу заставить Visual Studio выдавать ошибку C4716 для gGetM, поскольку теперь функция должна быть скомпилирована, встроена или нет.

Я тоже могу

inline int Simple::GetN() const 
{ 
}

, чтобы явно сделать GetN inline и «устранить» ошибку.

Это все зависит от компилятора и, возможно, даже от опции компилятора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...