簡體   English   中英

std::any_cast 是否調用析構函數? 演員陣容如何?

[英]Does std::any_cast call destructor? How the cast works?

#include <iostream>
#include <any>

using namespace std;

class c {
public:
    c() :a{ 0 } { cout << "constructor\n"; }
    c(int aa) :a{ aa } { cout << "Constructor\n"; }
    ~c() { cout << "destructor\n"; }
    int get() { return a; }
private:
    int a;
};

auto main()->int
{
    any a{ 5 };
    cout << any_cast<int>(a) << '\n';
    
    a.emplace<c>(3);
    cout << '!' << any_cast<c>(a).get() << '\n';
    //des
    cout << '\n';
    
    a.emplace<c>(9);
    cout << '!' << any_cast<c>(a).get() << '\n';
    //des
}

在每個 any_cast 之后調用的析構函數。 並且,下面的代碼會導致運行時錯誤。 我認為原因是 any_cast(C) 的工作管道可能像~C() then X(C) ERROR!!C doesn't exist any_cast 真的像那樣工作嗎?

我添加了打擊代碼並產生了運行時錯誤。

class X {
public:
    X() :a{ 0 } { cout << "xonstructor\n"; }
    X(c& aa) :a{ aa.get() } { cout << "Xonstructor\n"; }
    ~X() { cout << "Xdestructor\n"; }
    int get() { return a; }
private:
    int a;
};

auto main()->int
{
    any a{ 5 };
    cout << any_cast<int>(a) << '\n';
    
    a.emplace<c>(3);
    cout << '!' << any_cast<X>(a).get() << '\n';
//runtime error after '!'
    cout << '\n';
    
    a.emplace<c>(9);
    cout << '!' << any_cast<X>(a).get() << '\n';
}

您正在從std::any中的一個復制c (或X )。 該副本在流式傳輸后在表達式的末尾被銷毀。

any_cast不做任何轉換。 如果您要求它提供與它存儲的類型不同的類型,它會拋出。 當您放置c並要求提供X時,它會拋出std::bad_any_cast ,因為X不是c

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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