簡體   English   中英

將 dynamic_cast 與 std::exception 一起使用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM