【问题标题】:No error on missing return for inlined member (VS2013)内联成员缺少返回没有错误(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++;
}

【问题讨论】:

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

标签: c++ visual-c++ visual-studio-2013


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 2013-03-21
    • 2016-01-04
    相关资源
    最近更新 更多