以下代码在g ++ 7.3和clang ++ 7.0中给出了不同的编译结果,但是据我所知,S1,S2,S3的所有副本构造函数均被删除,并且任何实例化均不应成功。
问题:
- 这种情况(S1,S2)在C ++标准中是否未定义?
- 没有构造函数/析构函数实现的匿名联合与具有默认构造函数/析构函数的命名联合之间有什么区别?
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;
}