我剛剛寫了下面的程序&它編譯&運行正常。 (見現場演示here.)析構函數調用標量類型和未定義的行爲
#include <iostream>
typedef int T;
int main()
{
int a=3;
std::cout<<a<<'\n';
a.~T();
std::cout<<a;
return 0;
}
爲什麼程序編譯罰款? 如果我沒有錯的話標量類型在C++中沒有構造函數和析構函數。那麼,這個程序是否有明確的定義?在這種情況下,顯式調用析構函數是否會破壞variable a
或者當函數執行完成時它會被編譯器自動銷燬?我知道在其生命週期結束後訪問對象在C++中有未定義的行爲。但是C++標準對此有何評論?
我在SO上發現了類似的問題here。通過@Columbo給出的答案說:
你不能要求標量類型析構函數,因爲他們沒有 之一。該聲明僅適用於模板代碼,其中您調用了不知道其類型的對象的析構函數 - 它刪除了爲標量(或甚至是 數組)類型編寫專門化的必要性。
所以,我不明白他給出的解釋。如果有人使用模板代碼來解釋它,那麼析構函數被稱爲類型未知的對象會更好。如果有人用簡單的例子解釋這個,我會很感激。
@vsoftco:爲什麼到目前爲止沒有人給出答案?每當我發佈任何問題時都很快,但這次看起來很慢。 – Destructor
我已經鏈接到完全相同的問題詢問其他地方 - 雖然該問題還沒有一個完整的答案,但它會被鏈接 –
@vsoftco確定,擦除 –