2013-05-13 115 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