Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;重新解释\u cast-这是否总是正确的?_C++_Casting_Operator Overloading - Fatal编程技术网

C++ C++;重新解释\u cast-这是否总是正确的?

C++ C++;重新解释\u cast-这是否总是正确的?,c++,casting,operator-overloading,C++,Casting,Operator Overloading,我已经编写了MyString和MyStringConst类。现在我需要不时地将MyString作为MyStringConst传递,从而重载cast操作符。这是我写的 MyString::operator const MyStringConst &() const { return reinterpret_cast<const MyStringConst &>(*this); } MyStringConst拥有此数据 char * str; int lengt

我已经编写了MyString和MyStringConst类。现在我需要不时地将MyString作为MyStringConst传递,从而重载cast操作符。这是我写的

MyString::operator const MyStringConst &() const
{
    return reinterpret_cast<const MyStringConst &>(*this);
}
MyStringConst拥有此数据

char * str;
int length;
volatile int hashCode;
int bufferSize;
const char * c_str;
int length;
volatile int hashCode;
另外还有一些方法,在这两个字符串中都可以重新计算hashCode


这段代码写得正确吗。我已经在MSVC 2013上测试过,它工作正常,但是我不知道它是否可以用于生产代码,可以用不同的编译器编译。

< P>数据成员的共同初始序列是不同的,C++在这种情况下不保证布局。即使类型仅因
const
限定而不同。否则,
union
s的保证实际上意味着,如果这些类型是标准布局类型,则它们需要有一个公共布局(根据9.5[class.union]第1段中的注释)

在实践中,我希望这两种类型的布局是相同的,
reinterpret\u cast
可以工作,但标准没有保证。根据您的注释
MyStringConst
仅保留一个指向字符串的指针,即不转换为引用,我只返回一个适当构造的
MyStringConst
,并避免依赖未定义的行为:

MyString::operator MyStringConst() const {
    return MyStringConst(str, length);
}
MyString
对象仍然必须与转换结果一样存在,但这与使用
reinterpret\u cast
的情况没有什么不同

顺便说一句,
hashCode
上的
volatile
是不明智的:它唯一的效果就是减慢程序的速度。我想你是想用它来实现线程间的同步,但是C++中的代码>易失性< /代码>根本不起作用:当你在一个线程中写入成员时,你会得到一个数据竞争,它在另一个线程中也被访问不同步。你会拼写这个成员

std::atomic<int> hashCode;
std::原子哈希码;

相反。

如果它们是两个完全不同的类,你不能只是将一个重新解释为另一个。数据可能未对齐等等。。。MyStringConst的目的是什么。为什么不直接使用const MyString?@thang MyString分配一个新字符串,MyStringConst not(只是一个围绕指针的包装器),但我需要对它们进行比较。实际上,它可能在现实生活中遇到的所有编译器中都能工作。但严格地说,这肯定不能保证有效。如果您只需要比较,那么您可以编写一个
compare
函数,该函数采用四种可能的组合[这只是比较函数上的一个薄包装,比较两个
const char*
——可能是长度(指较短者或两者)也传入]如果我在生产代码中发现它是作为
std::string
std::string const
的替代品,我肯定会在下一次代码评审中谈很多……一些吹毛求疵:一般来说,根据[9.2p16],相应的类型可能因const限定而不同,并且是公共初始序列的一部分;它们只需要与布局兼容,根据[3.9p11],这包括具有不同cv资格的类型。然而,在这里,对应的第一个成员是指向布局兼容类型的指针,而且,为了混水摸鱼,标准没有严格地将此类指针称为“布局兼容”但是,它确实指出了一些应该等效的内容,在[3.9.2p3]:[…]中,指向布局兼容类型的指针应具有相同的值表示和对齐要求[…]。我认为这应该使这种情况得到很好的说明,即使在对标准的逐字严格解释中,这两种类型没有共同的首字母顺序。我大胆猜测,该标准的目的是它们有共同的首字母顺序。刚刚发现了一个额外的指示:[3.9.3p1]的脚注:相同的表示和对齐要求意味着函数参数、函数返回值和联合的非静态数据成员的互换性。我刚刚意识到,我引用的内容主要是作为C++14之后的结果添加的,它仅包含在N4296中。也许DR中的DR会有用:-),以便使指向布局兼容类型的指针本身与布局兼容?@bogdan通过这种方式可以获得有趣的循环依赖关系。考虑:
structa;结构B;结构A{B*pb;};结构B{A*pa;}
A
B
布局兼容吗?