以下代码仅抛出"缺少返回值"概述成员的错误,GetIN。内联版本不会引发任何错误。如果我在类中使用该方法,我会得到两个错误。这对我来说似乎完全错了。标准中是否存在关于编译器忽略内联方法的返回值等内容的内容? (这是使用Visual Studio 2013编译的)
class MyClass
{
public :
MyClass()
: m_i(0)
{}
int GetI() { m_i++; }
int GetIN();
private:
int m_i;
};
int main()
{
return 0;
}
int MyClass::GetIN()
{
m_i++;
}
答案 0 :(得分:4)
C ++11§6.6.3[stmt.return] / 2状态:
离开函数末尾相当于没有值的返回;这会导致值返回函数中的未定义行为。
行为未定义,因此编译器不需要诊断错误。
为什么编译器不能诊断错误?因为函数GetI
是在类定义中内联定义的,所以它是内联隐式声明的。如果实际使用它们,编译器将仅生成内联函数的代码。您的程序不使用GetI
函数,因此编译器不会为其生成代码,因此编译器不会检测缺少的return语句。
如果您修改程序以使用GetI
函数,则编译器必须为该函数生成代码,然后检测缺少的return语句。
函数GetIN
不是内联的,因此编译器必须为它生成代码,因为它只在那个地方定义。