C++ 使用union为结构创建构造函数

C++ 使用union为结构创建构造函数,c++,c++11,C++,C++11,我的问题很好地解决了这个问题 但是,看起来我需要为该结构创建一个构造函数,因为以下代码: std::vector<Foo> row; row.push_back( Foo( 1, 1 ) ); 这句话错了 attempting to reference a deleted function 我需要定义所有3个构造函数吗 还是有别的事 蒂娅 引用自: 标准以[class.union]/2的形式陈述 联合可以有成员函数(包括构造函数和析构函数),但不能有虚函数(10.3)。并集不应具

我的问题很好地解决了这个问题

但是,看起来我需要为该结构创建一个构造函数,因为以下代码:

std::vector<Foo> row;
row.push_back( Foo( 1, 1 ) );
这句话错了

attempting to reference a deleted function
我需要定义所有3个构造函数吗

还是有别的事

蒂娅

引用自:

标准以[class.union]/2的形式陈述

联合可以有成员函数(包括构造函数和析构函数),但不能有虚函数(10.3)。并集不应具有基类。活接头不得用作基类。如果联合包含引用类型的非静态数据成员,则程序格式错误。一个联合的最多一个非静态数据成员可以有一个大括号或相等的初始值设定项。[注意:如果联合体的任何非静态数据成员具有非平凡的默认构造函数(12.1)、复制构造函数(12.8)、移动构造函数(12.8)、复制赋值运算符(12.8)、移动赋值运算符(12.8)或析构函数(12.4),则必须由用户提供联合体的相应成员函数,否则将被隐式删除(8.4.3)为工会。-结束说明

重点矿山

所以,OP对析构函数所做的可能也是构造函数(可能还有赋值运算符)所必需的

这里,使用构造函数的OP的增强示例:

#include <iostream>  
#include <string>

struct Value {
    int type;

    union Data {
        int intValue;
        double doubleValue;
        std::string stringValue;
        
        Data(int value): intValue(value) { }
        Data(double value): doubleValue(value) { }
        Data(const std::string &value): stringValue(value) { }
        ~Data() noexcept { }
    } data;

    Value(int value): type(1), data(value) { }
    
    Value(double value): type(2), data(value) { }

    Value(const std::string &value): type(3), data(value) { }
    
    ~Value()
    {
        using std::string;
        if (type == 3) data.stringValue.~string();
    }
};

int main()  
{
  { Value value(123);
    std::cout << "value: " << value.type << ": '" << value.data.intValue << "'\n";
  }
  { Value value(1.23);
    std::cout << "value: " << value.type << ": '" << value.data.doubleValue << "'\n";
  }
  { Value value(std::string("Hello world"));
    std::cout << "value: " << value.type << ": '" << value.data.stringValue << "'\n";
  }
}

在这个问题上,你没有接受任何答案。但是,专家建议使用一种新的方法。这会使你对这些丑陋的
union
的玩弄变得过时<代码>联合< /代码>是C的继承,并且在C++中不能很好地发挥作用。那么,为什么这么麻烦呢?@Scheff,std::variant是C++17。我仍然使用C++11.OK。我忽略了[c++11]——我的错。然而,即使这是一个后续问题,请提供一个答案。你的
union
可能缺少一些基本的东西,我看不到(没有代码的)是什么。boost(和其他兼容C++11的库)有variant类型。
#include <iostream>  
#include <string>

struct Value {
    int type;

    union Data {
        int intValue;
        double doubleValue;
        std::string stringValue;
        
        Data(int value): intValue(value) { }
        Data(double value): doubleValue(value) { }
        Data(const std::string &value): stringValue(value) { }
        ~Data() noexcept { }
    } data;

    Value(int value): type(1), data(value) { }
    
    Value(double value): type(2), data(value) { }

    Value(const std::string &value): type(3), data(value) { }
    
    ~Value()
    {
        using std::string;
        if (type == 3) data.stringValue.~string();
    }
};

int main()  
{
  { Value value(123);
    std::cout << "value: " << value.type << ": '" << value.data.intValue << "'\n";
  }
  { Value value(1.23);
    std::cout << "value: " << value.type << ": '" << value.data.doubleValue << "'\n";
  }
  { Value value(std::string("Hello world"));
    std::cout << "value: " << value.type << ": '" << value.data.stringValue << "'\n";
  }
}