默认构造函数和匿名联合的析构函数的未定义行为?

Mid*_*umo 5 c++ unions

以下代码使用g ++ 7.3和clang ++ 7.0提供了不同的编译结果,但据我所知,S1,S2,S3的所有复制构造函数均被删除,并且任何实例化均不应成功。

题:

  1. C ++标准中未定义这种情况(S1,S2)吗?
  2. 没有构造函数/析构函数实现的匿名联合与具有默认构造函数/析构函数的命名联合之间有什么区别?
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)