2013-05-13 78 views
1

以下内容的含义是什么?在块范围函数声明中内联

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编译它没有任何错误。

我错了吗?

+0

'我错了吗?'为什么你不运行它,看看会发生什么 – 2013-05-13 20:56:23

+2

因为我想知道什么标准真的对它说... ...是的,我试过了 - “gcc编译它没有任何错误“ – FrozenHeart 2013-05-13 20:57:26

回答

2

根据这个报价是不是这样的无效?

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

编译器接受它的事实可能是bug或文档扩展名,但肯定不符合C++ 11标准。

其他信息:

当我试着使用GCC 4.7.2编译上面的程序,我得到一个说警告:

警告:'inline'符的功能'foo'无效宣告出局全球范围[-pedantic]

+2

'gcc'在没有设置某些编译器标志的情况下保持沉默很多问题。如果全部打开,它可以变得非常特别。 – tadman 2013-05-13 21:16:14

0

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

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

+0

调用一个前向声明的函数肯定是合法的。这个代码唯一可疑的部分是'inline'关键字。 – 2013-05-13 23:00:35