我已经编写了MyString和MyStringConst类。现在,我需要不时将MyString作为MyStringConst传递,因此需要重载 Actor 。我写了这个
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;
另外,还有一些方法,可以在两个字符串中重新计算hashCode。
此代码是否正确编写。我已经在MSVC 2013上对其进行了测试,并且可以正常工作,但是我不知道它是否可以在生产代码中使用,并且可以使用其他编译器进行编译。
最佳答案
数据成员的公共(public)初始序列是不同的,在这种情况下,即使类型仅因const
限定而不同,C++也无法保证布局。否则,对union
的保证将有效地暗示,如果类型是标准布局类型,则它们必须具有相同的布局(根据9.5 [class.union]第1节中的注释)。
在实践中,我希望这两种类型的布局完全相同,并且reinterpret_cast
可以工作,但是标准并不能保证。根据您的评论,MyStringConst
仅持有指向字符串的指针,即不转换为引用,而是返回适当构造的MyStringConst
并避免依赖未定义的行为:
MyString::operator MyStringConst() const {
return MyStringConst(str, length);
}
MyString
对象仍然必须保持转换结果的生存时间,但这与使用reinterpret_cast
的情况没有什么不同。顺便说一句,
volatile
上的hashCode
是不明智的:唯一的影响就是减慢程序速度。我想您正在尝试使用它来实现线程之间的同步,但是在C++中,volatile
根本无济于事:在一个线程中写入成员时会发生数据争用,而在另一个线程中它也会不同步地访问。你会拼写成员std::atomic<int> hashCode;
代替。
关于c++ - C++ reinterpret_cast-这将始终正常工作吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28792554/