2011-09-07 88 views
8

在C++ 0x中-n3290草案:他們在一節說:解構:12.4 /第二點最後一行析構函數應該不應該用指針聲明嗎?在C++

  **A destructor shall not be declared with a ref-qualifier.** 

在C++ 03草案....他們沒有提到這一點在破壞者?

我的問題是這樣的類型聲明是否

*~S() ; //this declaration is allowed or not according to the Standard's 
    //**~S(); ***~S() ; etc........... 

被允許? 他在草稿中沒有描述過這個......宣言?

在GCC 4.6.0,太陽/ Oracle的C++ 12.0 --->這個聲明是允許 INT科莫C/C++ - >不允許

回答

7

您誤解了ref-qualifier意味着新標準。與C++ 03中的任何成員函數一樣,您可以使用相同的方式提供const限定符,您還可以將一個參考限定符添加到C++ 0x中的成員函數中。該改性劑會影響隱this參數的類型的函數:

struct test { 
    void f() const &&; // implicit "this" in "f" is of type "test const &&" 
}; 

在同樣的方式,析構函數不能static,或const,或const volatile在C++ 03,它不能採取REF C++ 0x中的限定符&&&)。當然,這一點在以前的標準中並不存在。

+0

@ DAvid:哦......但是根據析構函數的聲明..他們只說鄰接操作符..但沒有他們所說的內容......允許這樣的聲明,不允許使用等... like *〜A(),&〜A()等 – user751747

+2

@ user751747:語法規定* ref-qualifier *被附加到最右側的函數中(在* cv-qualifiers之後*),這意味着該句子引用:'〜A()&;'或'〜A()&&;',並將它們定義爲無效。 '&~A();'和'*〜A();'是無效的,因爲它們與*語法*不匹配,所以不需要對所有不應該編譯的內容提供額外的描述。例如,在標準中沒有任何地方說'a] [+ =/a'是不正確的,它只說明什麼構造是正確的,哪一個與它們中的任何一個都不匹配。 –

+0

@ david:謝謝 – user751747

10

這看起來並不像它會永遠成爲任何形式的合法函數聲明,更不用說析構函數了。我不太確定標準的這部分內容是什麼,但我有一個猜測。

我懷疑有一個限定詞說你的函數被右值引用調用。事情是這樣的:

class A { 
public: 
    void IAmAnRValue() &&; 
}; 

我覺得在標準的語言說,這個限定詞不允許在析構函數,就像具有後const也將是非法的。

而且,經過進一步調查,我的猜測正確性的確定性大大提高。這是理由:

它清楚地表明函數現在可以在'cv-qualifer'之後有'ref-qualifier'。這意味着功能聲明現在可以跟着const &const volatile &&而不是const。所用的術語(ref-qualifier)與您所引用標準的小部分所使用的術語相同。對於析構函數來說,它是不合適的。

+0

@ Omni:謝謝你的回答 – user751747

1

您正在尋找在同一段落中陳述的規則,12.4p2

析構函數沒有參數,也沒有返回類型可以爲它指定(甚至不爲空)。

短語「沒有返回類型可以爲它指定」還禁止「*」,這是目前尚不清楚,但可以通過與12.3.2p1比較可以看出(與this issue report比較):

...這樣的功能被稱爲轉換功能。不能指定返回類型。

該規則是什麼使得實現禁止* operator int() { }。你也可以說與12.4p1,雖然做爲所表述非常籠統,在析構函數部分的第一條語句,我覺得上面的其他說法應該是主要參數

使用可選功能 - 特別聲明語法說明符(7.1.2)後面跟着〜後跟析構函數的類名後跟一個空參數列表用於在類定義中聲明析構函數。

可以看出/閱讀,在該描述中沒有提及諸如*這樣的聲明者,其顯示了作者的意圖。

+0

感謝您的回答 – user751747

相關問題