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';
}
您正在 复制 c
(或 X
)std::any
。该副本在流出后在表达式末尾被销毁。
any_cast
不做任何转换。如果您要求它提供与它存储的类型不同的类型,它就会抛出。当您放置了一个 c
并请求一个 X
时,它会抛出 std::bad_any_cast
,因为 X
不是 c
。
#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
。