我写的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和它工作正常,但我不知道它是否可以在生产代码中使用,可与不同的编译器编译。
数据成员的公共初始序列是不同的,并且C ++不保证在所有关于该情况下的布局,即使类型仅通过不同const
资格。 否则,对于担保union
s就有效地暗示类型需要有一个共同的布局,如果他们是标准布局类型(按照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;
代替。