任何人都可以解释这个表达的含义吗?

时间:2010-05-13 17:41:33

标签: c++ types type-conversion

 void* GetData()
 {
    return reinterpret_cast<unsigned char*>(this);
 }

在这种情况下是否会发生自动类型强制的情况???我怎么能将我的类的对象转换为unsigned char * ??

4 个答案:

答案 0 :(得分:6)

我假设你引用了return reinterpret_cast<unsigned char*>(this);

这是一个令人讨厌的大块,可能采取了错误的方法来解决错误的问题。从技术上讲,它要求编译器将this指针的类型重新解释为unsigned char*指针。这里没有做任何工作:该语句仅指示编译器将指针视为不同类型。如果将类型解释为错误,这是灾难性的。

如果您希望按位检查对象,那么您可以尝试这样的事情:

union inspect_klass {
    klass obj;
    char bits[sizeof(klass)];
};

编辑:我对上述工会的信心现在已经动摇了。不要使用它,我正在寻找确认这个技巧确实被打破的确认。 :■

答案 1 :(得分:1)

我同意其他帖子:这几乎肯定不是你打算做的。

然而,IIRC,您可以通过C ++标准保证能够将任何类型的指针(不包括函数或成员指针)转换为unsigned char *或{{ 1}}然后返回未进入未定义行为的领域。此外,您可以通过类型为void *char *的左值访问任何对象(请参阅ISO 14882:2003第3.10.15节)。之前我已经使用过它来检查任意对象类型的内部表示。如果我对标准的阅读是正确的,那么在“实现定义的行为”中(显然,类型的内部表示取决于实现)。

例如,

unsigned char *

是一个模板函数,它将产生一个template<class T> std::vector<unsigned char> to_bytes (const T& t) { const unsigned char *p = reinterpret_cast<const unsigned char *>(&t); return std::vector<unsigned char>(p, p + sizeof(T)); } ,它是对象内部表示的副本。

但是,当你回来时,你被投射到std::vector<unsigned_char>这一事实让我怀疑你做的事情可能更令人讨厌而且更加未定义。

答案 2 :(得分:0)

首先,您的GetData()返回类型与表达式的返回类型不匹配。

reinterpret_cast类似于旧的旧式C cast - 你只是返回一个指向unsigned char *的指针。这完全不安全。实际上,您正在创建一个类的数据视图,可以按字节访问。

答案 3 :(得分:0)

严格地说,unsigned char *是一个字节数组。如果调用者要序列化数据,这似乎是完全合乎逻辑的事情。