gpt4 book ai didi

c++ - const union成员有什么用?他们不是毫无意义吗?

转载 作者:可可西里 更新时间:2023-11-01 16:39:58 24 4
gpt4 key购买 nike

在对此 answer 的评论中, Koushik 提出了 very valid point .

采取以下措施:

union U
{
int x;
const T y;
};

(我选择 T 这样这里就没有布局兼容性的通用初始序列,这意味着根据 [C++11 : 9.5/1].)

因为任何时候只有一个成员可能是“活跃的”(通过写入使其活跃),并且 y 不能在初始化后写入,这不是毫无意义吗?我的意思是,y 只能在第一次写入 x 之前被读取,并且只有当 y 是初始化成员时。

我是否遗漏了一些用例?或者这确实是语言功能的毫无意义的融合?

( This has been mentioned before )

最佳答案

这是一个引用语义类型的人为示例,您只想授予 const进入。 union用于从“类型删除”函数返回的类似变体的数据类型。

#include <memory>

template<class T>
struct reference_semantics
{
public:
reference_semantics(T* p ) : m(p) {}

int observe() const { return *m; }
void change(T p) { *m = p; }

private:
T* m;
};

struct variant
{
enum T { INT, DOUBLE } type;

union U
{
reference_semantics<int> const i;
reference_semantics<double> const d;

U(int* p) : i(p) {}
U(double* p) : d(p) {}
} u;
};

#include <iostream>
std::ostream& operator<<(std::ostream& o, variant const& v)
{
switch(v.type)
{
case variant::INT:
return o << "INT: "<<v.u.i.observe();
case variant::DOUBLE:
return o << "DOUBLE: "<<v.u.d.observe();
}
}

#include <string>

variant type_erased_access(std::string name)
{
// imagine accesses to a map or so

static double dval = 42.21;
static int ival = 1729;

if(name == "Lightness") return { variant::DOUBLE, &dval };
else return { variant::INT, &ival };
}

int main()
{
variant v0( type_erased_access("Lightness") );
std::cout << v0 << "\n";
variant v1( type_erased_access("Darkness") );
std::cout << v1 << "\n";
}

现在想象一下,而不是 intdouble ,使用了更大的数据类型,并且 reference_semantics数据类型实际上提供了比返回值更多的功能。

您甚至可能想要返回 reference_semantics<some_type> const对于一些论点,但一个普通的 int为他人。在这种情况下,您的 union甚至可能有 const 和非常量成员。

关于c++ - const union成员有什么用?他们不是毫无意义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20905744/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com