c++ - 您可以为具有 const 成员的联合编写一个复制构造函数吗?
问题描述
假设我有一个包含const
成员联合的结构,如下所示:
struct S
{
// Members
const enum { NUM, STR } type;
union
{
const int a;
const std::string s;
};
// Constructors
S(int t_a) : type(NUM), a(t_a);
S(const std::string & t_s) : type(STR), s(t_s);
};
到目前为止,一切都很好。但是现在说我想为这种类型编写一个复制构造函数。
看起来这并不涉及做任何邪恶的事情,但是由于我需要在成员初始化器中初始化 const 成员,所以我不知道如何根据依赖于type
成员的逻辑来执行此操作。
问题:
是否可以编写此构造函数?
如果不是,这本质上是语法疏忽,还是语言不能支持这样的事情有一些根本原因?
解决方案
是的,可以在这里编写复制构造函数。实际上它已经在实现内部完成std::variant
,它应该支持const
-types 等等。所以你的班级S
可以替换为
using S = std::variant<const int, const std::string>;
但是,如果由于圆顶原因您不能使用,则可以使用如下函数std::variant
编写复制构造函数:std::construct_at
#include <string>
struct S {
const enum { NUM, STR } type;
union {
const int a;
const std::string s;
};
S(int t_a) : type(NUM), a(t_a) {}
S(const std::string & t_s) : type(STR), s(t_s) {}
S(const S & rhs) : type(rhs.type) {
if ( type == NUM ) std::construct_at( &a, rhs.a );
if ( type == STR ) std::construct_at( &s, rhs.s );
}
~S() {
if ( type == STR ) s.~basic_string();
}
};
int main() {
S s(1);
S u = s;
S v("abc");
S w = v;
}
推荐阅读
- c# - System.Data.SqlClient.SqlException:'尝试在数据库中插入数据时对象名称无效(C#,Visual Studio)
- javascript - 从 CSS 类中修剪第一个和最后一个字符
- reactjs - 如何在网格中的材质 UI 中转动标签水平中心?
- python - 将列表附加为空数据框的行
- c# - 使用 SharpSnmpLib BulkWalk 方法执行 SNMP walk
- python-2.7 - 如何将 tkinter 输入框放在同一行?
- gatsby - 如何启用 GATSBY_CONTENTFUL_OFFLINE=true 的标志?
- python - 增加速度numpy.loadtxt?
- python - ValueError:使用 tensorflow 训练 CNN 时使用序列设置数组元素
- javascript - 为什么我的控制器中的保存功能不起作用?