gpt4 book ai didi

c++ - `std::pmr::monotonic_buffer_resource` : why the `dynamic_cast` ?

转载 作者:行者123 更新时间:2023-11-30 01:39:43 28 4
gpt4 key购买 nike

标准草案 N4618 是关于 std::pmr::monotonic_buffer_resource 的:

bool do_is_equal(const memory_resource& other) const noexcept override;

Returns: this == dynamic_cast<const monotonic_buffer_resource*>(&other)

换句话说,不仅仅是比较指针与 this == &rhs 的相等性, 标准希望供应商竭尽全力 dynamic_cast右边的指针。

我想不出任何理智情况下 dynamic_cast会改变比较的结果。不过,我能想到一些疯狂的案例:

class new_delete_memory_resource : public memory_resource {
void *do_allocate(size_t bytes, size_t align) override {
return ::operator new(bytes, align);
}
void *do_deallocate(void *p, size_t bytes, size_t align) override {
::operator delete(p, bytes, align);
}
bool do_is_equal(const memory_resource& rhs) const noexcept override {
return (this == &rhs);
}
};
class TwoHeadedResource :
public new_delete_memory_resource,
public monotonic_buffer_resource
{
};

TwoHeadedResource thr;
memory_resource *a = static_cast<new_delete_memory_resource *>(thr);
memory_resource *b = static_cast<monotonic_buffer_resource *>(thr);

assert(*a != *b);
assert(*b == *a);

这种差异是否有微妙的原因?如果标准制定了operator==会出什么问题通过删除 dynamic_cast 自反/对称/传递?

最佳答案

这是一个已知缺陷,但您的问题确实提醒我需要提交正式的问题报告。

this == &other 的简单表述是应该的。 dynamic_cast 是一些样板代码的保留,因此相等的 rhs 不必与 lhs 是同一对象才能被视为相等。在最一般的情况下,如果两个 pmr::memory_resource 对象可以互换但没有相同的地址,您必须将 rhs 动态转换为 lhs 的类型以确定平等。但是,在 pmr::monotonic_buffer_resource 的情况下,地址相等是必需的,因此 dynamic_cast 是多余的。

不过,您的TwoHeadedResource 很聪明。向你致敬,因为你找出了一种会产生影响的情况,即使那不是我们旨在支持的代码类型。 :-)

编辑:现在在 http://cplusplus.github.io/LWG/lwg-active.html#3000 上有针对此缺陷的官方问题报告。 .

关于c++ - `std::pmr::monotonic_buffer_resource` : why the `dynamic_cast` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45090642/

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