草案标准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);
这种差异是否存在微妙的原因?如果标准通过删除dynamic_cast
,使operator==
具有自反性/对称性/传递性,会出现什么问题?
this == &other
没有意义,因为这两个操作数具有不同的类型! - Kerrek SB&other
是静态类型为memory_resource*
,而this
的静态类型是monotonic_buffer_resource*
,它可以隐式转换为memory_resource*
。这是经典的面向对象继承,不是吗? - Quuxplusonedo_is_equal
是由基类std::pmr::memory_resource
提供的私有虚方法。有关详细信息,请参见cppreference,我认为这些内容超出了此特定问题的范围。 - Quuxplusonepmr
设计并能回答这些问题的人数可以用一只手或两只手来计算。而在 Stack Overflow 经常出没的这样的人数大约为零。 - T.C.