class ESClass
{
public:
void PrintMe() throw();
void PrintMe(int) throw(int);
};
我想知道我們是否可以爲重載函數定義不同的異常規範。換句話說,我們可以給PrintMe函數的不同版本提供不同的異常說明嗎?重載函數的C++異常規範
警告C4290:從VS2010
注忽略除C++異常說明書來指示 一個函數不是__declspec(拋出異常)
class ESClass
{
public:
void PrintMe() throw();
void PrintMe(int) throw(int);
};
我想知道我們是否可以爲重載函數定義不同的異常規範。換句話說,我們可以給PrintMe函數的不同版本提供不同的異常說明嗎?重載函數的C++異常規範
警告C4290:從VS2010
注忽略除C++異常說明書來指示 一個函數不是__declspec(拋出異常)
是:它們是不同的功能,它們可以有不同的異常規範。
如果虛擬成員函數有異常規範,任何倍率(未過載)必須具有異常規範是至少嚴格爲被重寫的成員函數。
當然,你應該"never write an exception specification"除了those few situations where you must。
Visual C++不完全支持異常規範,因此它允許一些實際上不符合C++語言規範的代碼。 The warning you mention只是意味着你使用的是不使用由Visual C++支持C++語言特徵代碼:
的功能被使用異常規範,它的Visual C++接受但不執行申報。在編譯過程中被忽略的具有異常規範的代碼可能需要重新編譯和鏈接,以便在支持異常規範的未來版本中重用。
雖然它是合法的,但從不同的重載引發不同的異常集合是一種壞習慣。當只更改傳遞給函數的參數時,很容易忘記更新'catch'子句... –
關於異常規範,「嚴格性」是什麼意思? – pmr
@pmr:「如果一個虛擬函數有一個異常規範,那麼覆蓋任何派生類中的虛函數的任何函數的所有聲明(包括定義)都應該只允許基類的異常規範所允許的異常虛函數(C++ 03§15.4/ 3)。「因此,覆蓋可以有一個_stricter_異常規範,這意味着它允許拋出_fewer_異常。 –
我建議你閱讀這個:http://www.gotw.ca/publications/mill22.htm。切入道德,「道德#1:絕不寫例外規範 道德#2:除了可能是空的,但如果我是你,我甚至會避免這樣做。」 –
視覺工作室警告一直存在。這不是唯一的情況,它警告你不遵守C++標準。 –
@Fred,我沒有找到與在提供的鏈接中爲重載函數定義異常規範相關的主題。 – q0987