C++ std::任何_cast调用析构函数吗?演员阵容如何运作?

C++ std::任何_cast调用析构函数吗?演员阵容如何运作?,c++,stdany,anycast,C++,Stdany,Anycast,您正在从std::any中的文件复制c(或X)。该副本在流式输出后在表达式末尾被销毁 any_cast不进行任何转换。如果您要求它输入与它存储的类型不同的类型,它将抛出。当你放置了一个c并要求一个X时,它会抛出std::bad\u any\u cast,因为X不是ca.emplace(3)是一个输入错误。你需要a.emplace(3)@super我不认为这是一个打字错误…我认为OP打算调用any\u cast@super中的转换构造函数。我的想法是用3将a转换成c,然后用X转换成any\u ca

您正在从
std::any
中的文件复制
c
(或
X
)。该副本在流式输出后在表达式末尾被销毁


any_cast
不进行任何转换。如果您要求它输入与它存储的类型不同的类型,它将抛出。当你放置了一个
c
并要求一个
X
时,它会抛出
std::bad\u any\u cast
,因为
X
不是
c
a.emplace(3)是一个输入错误。你需要
a.emplace(3)
@super我不认为这是一个打字错误…我认为OP打算调用
any\u cast
@super中的转换构造函数。我的想法是用3将a转换成c,然后用X转换成any\u cast。这不是打字错误。任何_cast都只是一个值获取工具。不是转换器!我说得对吗?是的,它只用于提取存储在any中的值
#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
}
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';
}