C ++的reinterpret_cast - 这将始终正常工作?(C++ reinterpret

2019-10-22 02:53发布

我写的MyString和MyStringConst类。 现在我需要不时通的MyString为MyStringConst,因此超载投运营商。 我写了这个

MyString::operator const MyStringConst &() const
{
    return reinterpret_cast<const MyStringConst &>(*this);
}

MyString中有这个数据

char * str;
int length;
volatile int hashCode;
int bufferSize;

MyStringConst有这个数据

const char * c_str;
int length;
volatile int hashCode;

另外还有一些方法,这两个字符串可以重新计算哈希码。

这是代码编写正确。 我已经测试了MSVC 2013和它工作正常,但我不知道它是否可以在生产代码中使用,可与不同的编译器编译。

Answer 1:

数据成员的公共初始序列是不同的,并且C ++不保证在所有关于该情况下的布局,即使类型仅通过不同const资格。 否则,对于担保union s就有效地暗示类型需要有一个共同的布局,如果他们是标准布局类型(按照9.5 [class.union]记第1款)。

在实践中我希望这两种类型的布局相同,而且reinterpret_cast作品,但没有保证的标准。 基于您的评论MyStringConst仅仅持有指向字符串,即,而不是转化为引用,我将只返回一个适当地构造MyStringConst并避免依赖于未定义行为:

MyString::operator MyStringConst() const {
    return MyStringConst(str, length);
}

MyString对象仍具有长住从转换的结果,但是这是使用的情况下没有什么不同reinterpret_cast

顺便说一句,在volatilehashCode是不明智的:它会拥有的唯一作用是程序慢下来。 我猜你要使用它的线程之间,但在实现同步C ++ volatile不会与在所有帮助:写在一个线程中的成员时,它也访问在另一个线程不同步你得到数据的比赛。 你会拼写成员

std::atomic<int> hashCode;

代替。



文章来源: C++ reinterpret_cast - will this always work correctly?