【发布时间】:2019-02-12 20:21:49
【问题描述】:
假设我有一个包含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 成员的逻辑来执行此操作。
问题:
这个构造函数可以写吗?
如果不是,这本质上是句法疏忽,还是语言不能支持这样的事情有什么根本原因?
【问题讨论】:
-
可能想试试
const std::variant<int, std::string>。 -
如果你想在联合中使用
std::string,你真的需要使用标记联合。联合中的非平凡类型删除了所有联合特殊成员函数,并且正确地重新实现它们并非易事。 -
@NathanOliver:我确实标记了工会;这就是
type成员的用途。 (如果您只是指出我需要例如实现我自己的析构函数,我理解这一点,但为简洁起见,将其从代码示例中省略。) -
哦,我真傻。您正在建立一个标记工会。
std::variant的源代码应该给你一个例子来说明如何做到这一点,因为它支持 const 成员。 -
您应该可以在没有 UB 的复制构造函数主体中使用placement-new 来初始化
a或s。相关:stackoverflow.com/questions/33058717/…