内联成员缺少返回没有错误(VS2013)

Posted

技术标签:

【中文标题】内联成员缺少返回没有错误(VS2013)【英文标题】:No error on missing return for inlined member (VS2013) 【发布时间】:2014-05-28 03:44:46 【问题描述】:

以下代码仅对概述的成员 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++;

【问题讨论】:

注意:一般情况下编译器无法准确诊断返回失败;这需要解决停机问题。 【参考方案1】:

C++11 §6.6.3[stmt.return]/2 状态:

从函数的末尾流出相当于没有值的返回;这会在返回值的函数中导致未定义的行为。

行为未定义,因此编译器不需要诊断错误。

为什么编译器不诊断错误?因为函数GetI 是在类定义中内联定义的,所以它被隐式声明为内联。编译器只会为实际使用的内联函数生成代码。您的程序没有使用GetI 函数,因此编译器不会为其生成任何代码,因此编译器不会检测到缺少的返回语句。

如果您修改程序以使用GetI 函数,编译器必须为该函数生成代码,然后检测缺少的返回语句。

函数GetIN不是内联的,所以编译器必须为它生成代码,因为它只定义在那个地方。

【讨论】:

以上是关于内联成员缺少返回没有错误(VS2013)的主要内容,如果未能解决你的问题,请参考以下文章

内联成员函数的C ++链接错误[重复]

注意:缺少 vtable 通常意味着第一个非内联虚拟成员函数没有定义

如何解决“缺少vtable通常意味着第一个非内联虚成员函数没有定义。”

JSON 解析错误:缺少对象成员的名称

内联函数无法访问非公共 API:@PublishedApi vs @Suppress vs @JvmSynthetic

iOS中的vtable错误