以下代码使用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 << "A()" << std::endl;
}
~A()
{
std::cout << "~A()" << std::endl;
}
};
int main()
{
{
S1<A> a;
auto b = a; // g++ OK, clang++ OK
}
{
S2<A> a;
auto b = a; // g++ fail, clang++ OK
}
{
S3<A> a;
auto b = a; // g++ fail, clang++ fail
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)