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

以下代码在g ++ 7.3和clang ++ 7.0中给出了不同的编译结果,但是据我所知,S1,S2,S3的所有副本构造函数均被删除,并且任何实例化均不应成功。

问题:

  1. 这种情况(S1,S2)在C ++标准中是否未定义?
  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;
}
shu545312271 回答:默认构造函数和匿名联合的析构函数的未定义行为?

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3097441.html

大家都在问