无法引用某类的默认构造函数的一种可能情况

在union的成员中存在具有构造函数与析构函数的类型时,构造包含该union的类时会报错“无法引用…的默认构造函数 –它是已删除的函数”,该错误只提示无法引用类的默认构造函数,同时若未使用自定义构造函数,则不会进一步指出无法引用union的构造函数,因此该情况在小微型开发时可能十分令人困惑。报错原因可能是union中的默认构造函数与默认析构函数是无法正确的完成其职责,因而选择默认删除默认构造与默认析构函数。
解决方法一:
由于union与struct的语法接近,因此可以简单将union改为struct实现平稳过渡,而几乎不会出现问题。
解决方法二:
若实在无法舍弃union带来的内存节约优势或者其他的优势,可在类外定义此union并添加自定义构造函数与自定义析构函数

union myUnion {
	std::unique_ptr upFloat;
	std::unique_ptr upInt;

	myUnion() { new (&upFloat) std::unique_ptr{}; }
	~myUnion() {}
};

留下评论