2011-03-31 56 views
2
從ISO標準的$ 3.1

聲明:第一點

n3242說:

的聲明(第7章)可 引入一個或多個名稱爲 由前面的聲明引入的翻譯單元或重新聲明名稱 。 如果是這樣,那麼聲明將指定 名稱的解釋和屬性。聲明也可能具有以下效果: - 靜態斷言(第7章), - 控制模板實例化(14.7.2), - 使用屬性(第7章)和 - 沒有任何東西(在空聲明)。

ISO 2003 DOC表示:

的聲明(第7節)引入 名轉換成一個翻譯單元或由 先前聲明引入
redeclares名稱。聲明
指定這些名稱的解釋和 屬性。

任何一個可以解釋的區別是什麼。

他們說「的聲明也可能有效果,包括:」 ......任何一個可以解釋什麼是編程

請解釋編程方式這些影響(用一個例子程序)而言,這些影響?

回答

3

我相信這只是一些新功能已經改變了聲明的工作方式 - 在小細節。

例如,這不會引入一些名稱,還會影響代碼的編譯。

struct A 
{ 
    int x; 
}; 

struct B 
{ 
    A a; 
    static_assert(sizeof(a) > 10, "Wrong member size"); 
}; 

我們還有空聲明 (我相信的只能是一個類的內部使用)

struct C 
{ 
    void f() 
    { };  // Semicolon here is allowed, but is an empty declaration 
}; 

空聲明是一個聲明,不引入一個名稱(因爲它是空的)。

想通了「影響模板實例化」,以及,我想:

template<class T> 
class X 
{ 
    // some members 
}; 

extern template class X<int>; 
extern template class X<char>; 

告訴那X<int>X<char>將在其他地方實例化,並沒有在這裏產生的編譯器。

+0

佩爾森:感謝你的答案。控制模板實例化的情況..它的效果如何? – 1User 2011-03-31 07:19:24

+1

空的聲明可以出現在任何地方。 C++語法總是有一個特殊的規則,允許在一個類的一個函數結尾處使用可選的分號;空的聲明是一種推廣這一點的手段。(我在這裏的最新草案顯示他們仍然有空的表達陳述 - 我原以爲這個空的聲明包含了這個,並且沒有必要。) – 2011-03-31 08:33:23

+0

@James事實上,在馬德里會議上,我們會幾乎已經發布了一個標準,允許您在constexpr函數體中擁有「空白聲明」。當然,我們想要發佈的是「空聲明」或「空表達聲明」。好,我們及時修正了這個問題(最後一分鐘的變化),但是這表明你並不是一個人在想這種方式:) – 2011-03-31 10:34:51