gpt4 book ai didi

c++ - 这是 reinterpret_cast 的合法使用吗?如果不是,我该怎么做?

转载 作者:搜寻专家 更新时间:2023-10-31 00:33:27 26 4
gpt4 key购买 nike

<分区>

此代码演示了我要解决的问题:

#include <map>

class Point
{
public:
float m_x;
float m_y;
};

typedef std::set<Point *> PointSet;

typedef std::set<const Point * const> ConstPointSet;

float GetMinimumRange(const ConstPointSet &pointSet)
{
float minimumRange(0.0f);
// find the smallest distance between any pair of points in the set
return minimumRange;
}

float GetMinimumRangeWrong(const PointSet &pointSet)
{
PointSet::iterator first(pointSet.begin());
Point * point(*first);
point->m_x = 42.0f; // I want to prevent this
return 0.0f;
}

class PointSet_
{
public:
std::set<Point *> m_pointSet;

float GetMinumumRange() const
{
PointSet::iterator first(m_pointSet.begin());
Point * point(*first);
point->m_x = 42.0f; // I want to prevent this
return 0.0f;
}
};

void test()
{
PointSet myPointSet;
// Add some points to my set

// This fails because the compiler states it can't convert from PointSet to ConstPointSet.
//float minimumRange1(GetMinimumRange(myPointSet));

// reinterpret_cast<> is the only cast that works here, const_cast fails with the same
// complaint as the line above generates
ConstPointSet *myConstPointSet(reinterpret_cast<ConstPointSet *>(&myPointSet));

float minimumRange1(GetMinimumRange(*myConstPointSet));

float minimumRange2(GetMinimumRangeWrong(myPointSet));
}

我想创建一个接受 PointSet 的例程, 评估任何一对 Point 之间的最小范围s 在集合中,但它保证不会修改 PointSet以任何方式传递给它。它不能修改任何引用的成员 Point , 它不能改变指针本身,也不能从集合中添加或删除成员

问题是编译器正确地查看了 PointSetConstPointSet由于 const 的差异而作为不同类型内部类型的限定符,因此拒绝在它们之间转换,即使我只添加 const预选赛。

我尝试创建一个包含 PointSet 的类,并创建一个 const 成员函数,但即使在那里它也允许修改内部 Point 之一秒。至少 MSVC 会毫无怨言地编译它。我承认我对此感到非常惊讶。

我发现唯一可行的方法是使用 reinterpret_cast<>将指针转换为 PointSet指向 ConstPointSet 的指针.该标准确实注意到 reinterpret_cast<>可用于添加 const限定符,但这适用于这种情况吗?

如果没有,有什么办法可以做我想做的事吗?我意识到可以使用良好的代码纪律来确保 GetMinimumRange()不修改传递的 PointSet , 但我想得到那些 const那里的预选赛有两个原因。

  1. 他们会确保如果有人修改了GetMinimumRange()他们不能让它修改 PointSet .

  2. 它将允许编译器优化对 GetMinimumRange() 的调用.在没有 const 的情况下限定符,因此无法在调用站点就可在调用中缓存的值做出任何假设,因此可能导致数据的冗余提取。

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