我注意到,当以下操作非多态时,例如以下代码,编译器将优化一些dynamic_cast:
#include <iostream>
using namespace std;
struct A
{
virtual ~A() = default;
virtual int f()
{
return 1;
};
virtual int g() = 0;
};
struct B : A
{
int g() const
{
return 2;
}
int g() override
{
return 3;
}
int h()
{
return 4;
}
};
int main()
{
A* p = new B();
auto u = p->f();
auto v1 = static_cast<B*>(p)->f();
auto v2 = dynamic_cast<B*>(p)->f();
auto w = p->g();
auto x1 = static_cast<const …Run Code Online (Sandbox Code Playgroud) 以下代码使用g ++ 7.3和clang ++ 7.0提供了不同的编译结果,但据我所知,S1,S2,S3的所有复制构造函数均被删除,并且任何实例化均不应成功。
题:
template <typename T>
struct S1
{
union
{
T payload;
};
S1() {}
~S1() {}
};
template <typename T>
struct S2
{
union
{
T payload;
};
S2() {}
virtual ~S2() {}
};
template <typename T>
struct S3
{
union U
{
T payload;
U() = default;
~U() = default;
} storage;
S3() {}
~S3() {}
};
#include <iostream>
struct A // overloaded A() & ~A()
{
A()
{
std::cout << …Run Code Online (Sandbox Code Playgroud) 没有人能解释一下如何delete x正常工作吗virtual ~X()
#include <iostream>
struct B
{
B()
{
std::cout << "B()" << std::endl;
}
virtual ~B()
{
std::cout << "~B()" << std::endl;
}
};
struct C : B
{
C()
{
std::cout << "C()" << std::endl;
}
virtual ~C()
{
std::cout << "~C()" << std::endl;
}
};
template <class T>
struct X : T
{
X()
{
std::cout << "X()" << std::endl;
}
~X()
{
std::cout << "~X()" << std::endl;
}
};
template <class T> …Run Code Online (Sandbox Code Playgroud)