std::any_cast 是否调用析构函数?演员阵容如何?

问题描述

#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';
}

解决方法

您正在复制c(或X)中的std::any。该副本在流出后在表达式结束时被销毁。

any_cast 不做任何转换。如果您要求它提供与它存储的类型不同的类型,它会抛出。当您放置一个 c 并要求一个 X 时,它会抛出 std::bad_any_cast,因为 X 不是 c