2

以下是什么意思?

ISO/IEC 14882:2011

7.1.2 函数说明符 [dcl.fct.spec] ...
3 ... inline 说明符不应出现在块作用域函数声明中。

根据这个报价,这样的事情是否无效?

#include <iostream>

int main()
{
    inline void foo();
    foo();
}

void foo()
{
    std::cout << "::foo() \n";
}

gcc 编译它没有任何错误。

我错了吗?

4

2 回答 2

3

根据这个报价,这样的事情是否无效?

是的,由于您在问题文本中引用的标准段落,它无效。

编译器接受它的事实可能是错误或已记录的扩展,但绝对不符合 C++11 标准。

附加信息:

当我尝试使用 GCC 4.7.2 编译上述程序时,我收到一条警告:

警告:说明符对声明在全局范围之外的'inline'函数无效[ ]'foo'-pedantic

于 2013-05-13T21:03:52.917 回答
0

我认为这gcc是在欺骗自己。这应该是非法的。这里发生的事情是gcc添加inline void foo();到它的符号表中并认为它是 undefinedfoo();因此,就它而言,调用应该是未定义的。

但是,当链接器 ( ld) 稍后尝试链接代码时,它会找到foo可访问的全局范围内的定义并使用它来代替。

于 2013-05-13T21:04:21.147 回答