相关疑难解决方法(0)

如果从不通过它们进行修改,是否允许 const 强制转换对实际 const 对象的引用的常量性?

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

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

   virtual void set_foo(BoundedFloat) = 0;
   virtual BoundedFloat get_foo() const = 0;
};
Run Code Online (Sandbox Code Playgroud)

这用作记录的高级表示,当保存到光盘并通过线路传输时,该记录具有不同的表示。所以大多数实现只需要将它们的成员转换为所需的高级表示。

作为有效实现的示例,让我们定义stored_record. 这用于以有损格式存储高级记录:

struct stored_record
{
    int16_t foo;
};
Run Code Online (Sandbox Code Playgroud)

stored_record可以实现是有道理的,record_interface但由于各种原因它不能(例如,它需要是trivially_copyable)。我们可以制作一个为其实现接口的包装器:

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_;
};
Run Code Online (Sandbox Code Playgroud)

现在的问题是当给定 a 时我们不能使用包装器,const stored_record &因为包装器存储了一个可变引用。我们也不能让它存储非常量引用,因为它无法实现非常量 …

c++ interface constants language-lawyer

10
推荐指数
1
解决办法
328
查看次数

以下是使用const_cast未定义的行为吗?

这是一个语言律师问题,而不是一个好的练习题.

以下代码是有效还是未定义的行为?const对象最终调用非const函数,但它实际上并不修改对象的状态.

struct Bob
{
    Bob() : a(0) {}

    int& GetA()
    {
        return a;
    }

    const int& GetA() const
    {
        return const_cast<Bob&>(*this).GetA();
    }

    int a;
};

int main()
{
    const Bob b;
    int a = b.GetA();
}
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer

8
推荐指数
1
解决办法
273
查看次数

const构建空基类

它是未定义的行为来const_cast消除一个空的基类并在其上调用非const方法吗?例如

class EmptyBase {
public:
    void bar() { ... }
};

class Something : public EmptyBase {
public:
    void foo() const {
        const_cast<EmptyBase&>(static_cast<const EmptyBase&>(*this)).bar();
   }
};
Run Code Online (Sandbox Code Playgroud)

我无法在标准(C++ 14和C++ 17)中找到解决这个问题的相关信息.

c++ const-cast language-lawyer c++14 c++17

6
推荐指数
1
解决办法
153
查看次数

标签 统计

c++ ×3

language-lawyer ×3

c++14 ×1

c++17 ×1

const-cast ×1

constants ×1

interface ×1