[英]Using dynamic_cast with std::exception
在什么條件下dynamic_cast
可以與 std::exception 一起使用,如下面的代碼所示?
1)
#include <exception>
class MyException : public std::exception
{
};
int main()
{
std::exception * e = new MyException();
MyException * me = dynamic_cast<MyException *>(e);
static_cast<void>(me);
return 0;
}
2)
#include <exception>
#include <vector>
int main()
{
try
{
std::vector<int> v;
int a = v.at(15);
}
catch (const std::exception & e)
{
const std::out_of_range & oe = dynamic_cast<const std::out_of_range &>(e);
}
return 0;
}
是否使用啟用的 RTTI 編譯 C++ 運行時庫? (它是否遵循第二個示例有效的事實)?
編輯1:
如果我在禁用 RTTI 的情況下編譯第二個示例:
cl /std:c++17 /EHsc /GR- b.cpp
我收到以下警告:
Microsoft (R) C/C++ Optimizing Compiler Version 19.16.27025.1 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
b.cpp
b.cpp(13): warning C4541: 'dynamic_cast' used on polymorphic type 'std::exception' with /GR-; unpredictable behavior may result
Microsoft (R) Incremental Linker Version 14.16.27025.1
Copyright (C) Microsoft Corporation. All rights reserved.
在什么條件下 dynamic_cast 可以與 std::exception 一起使用,如下面的代碼所示?
我認為沒有任何事情會阻止您這樣做,除非您明確禁用 RTTI。
是否使用啟用的 RTTI 編譯 C++ 運行時庫?
是的。
new MyException()
不要那樣做。 這是泄漏的秘訣。
在您的第二個示例中,您應該捕獲正確的異常類型而不是強制轉換它:
int main()
{
try
{
std::vector<int> v;
int a = v.at(15);
}
catch (const std::out_of_range & oe)
{
// ah yes, much better.
}
catch (const std::exception & e)
{
// fallback
}
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.