内联块作用域函数声明

时间:2013-05-13 20:54:28

标签: c++

以下是什么意思?

  

ISO / IEC 14882:2011

     

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

根据这个引用,这是否无效?

#include <iostream>

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

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

gcc编译它没有任何错误。

我错了吗?

2 个答案:

答案 0 :(得分:2)

  

根据这个引用,这是否无效?

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

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

其他信息:

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

  

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

答案 1 :(得分:0)

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

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