gpt4 book ai didi

c++ - 如果从未通过它们进行修改,是否允许对实际 const 对象的引用进行 const 转换?

转载 作者:行者123 更新时间:2023-12-01 12:01:40 25 4
gpt4 key购买 nike

我有一个声明 const 和非常量成员函数的抽象类。为了讨论,假设它看起来像这样:

class record_interface
{
public:
virtual ~record_interface() = default;

virtual void set_foo(BoundedFloat) = 0;
virtual BoundedFloat get_foo() const = 0;
};
这用作记录的高级表示,该记录在保存到磁盘并通过线路传输时具有不同的表示。所以大多数实现只需要将其成员转换为所需的高级表示。
作为一个有效实现的例子,让我们定义 stored_record .这用于以有损格式存储高级记录:
struct stored_record
{
int16_t foo;
};
stored_record 是有道理的可以执行 record_interface但由于各种原因它不能(例如,它需要是 trivially_copyable )。我们可以制作一个为其实现接口(interface)的包装器:
class record_wrapper : public record_interface
{
public:
record_wrapper(stored_record & wrapped)
: wrapped_(wrapped) {}

void set_foo(BoundedFloat value) final { wrapped_.foo = convert_to_int16(value); }
BoundedFloat get_foo() const final { return convert_from_int16(wrapped_.foo); }

private:
stored_record & wrapped_;
};
现在的问题是当给定 const stored_record & 时我们不能使用包装器。自从
包装器存储一个可变引用。我们也不能让它存储一个非常量引用,因为它不能实现非常量 setter 函数。
现在我想知道提供 const_cast 的工厂函数是否有效。离开
一个 const stored_record &const但也返回 const wrapper以便实际无法修改引用:
record_wrapper make_wrapper(stored_record & wrapped) {return {wrapped}; }
record_wrapper const make_wrapper(stored_record const & wrapped) { return {const_cast<stored_record &>(wrapped)}; }
编辑 : 返回一个 const record_wrapper不会真正将返回值限制为 const ,解决方案可以是返回 const_wrapper<record_wrapper>或类似的东西。
这是 const_cast 的有效用法吗?还是由于 const_cast 导致的未定义行为?带走 const - 对实际 const 对象的引用 - 即使它从未通过它进行修改。

最佳答案

根据 https://en.cppreference.com/w/cpp/language/const_cast :

const_cast makes it possible to form a reference or pointer to non-const type that is actually referring to a const object or a reference or pointer to non-volatile type that is actually referring to a volatile object. Modifying a const object through a non-const access path and referring to a volatile object through a non-volatile glvalue results in undefined behavior.


所以, const_cast本身是允许的(并且定义明确),即使通过生成的非常量引用实际修改对象是未定义的行为。

关于c++ - 如果从未通过它们进行修改,是否允许对实际 const 对象的引用进行 const 转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62551010/

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