【问题标题】:Valid use of reinterpret_cast?reinterpret_cast 的有效使用?
【发布时间】:2012-04-18 06:31:48
【问题描述】:

根据经验,以下工作(gcc 和 VC++),但它是有效且可移植的代码吗?

typedef struct 
{
    int w[2];
} A;

struct B
{
    int blah[2];
};

void my_func(B b)
{
    using namespace std;
    cout << b.blah[0] << b.blah[1] << endl;
}

int main(int argc, char* argv[])
{

    using namespace std;

    A a;
    a.w[0] = 1;
    a.w[1] = 2;

    cout << a.w[0] << a.w[1] << endl;

    // my_func(a);                     // compiler error, as expected
    my_func(reinterpret_cast<B&>(a));  // reinterpret, magic?
    my_func(  *(B*)(&a) );             // is this equivalent? 

    return 0;
}
// Output:
// 12
// 12
// 12
  • reinterpret_cast 有效吗?
  • C 样式转换是否等效?
  • 目的是将位于&amp;a 的位解释为 B 类,这是一种有效/最好的方法吗?

(题外话:对于那些想知道为什么我正在尝试这样做的人,我正在处理两个需要 128 位内存并使用具有不同内部结构的 C 库名称 - 很像我示例中的结构。我不想要 memcopy,也不想在 3rd 方代码中乱搞。)

【问题讨论】:

  • 就我个人而言,我只是认为它相当于 c-style cast 的 c++
  • @JurajBlaho 我看到了,但上面的细微差别是我没有使用指针(在重新解释演员表中) - 这足以让我至少想仔细检查一下有效。

标签: c++


【解决方案1】:

在 C++11 中,如果这两种类型布局兼容,这是完全允许的,这对于相同且具有标准布局的结构是正确的。 See this answer for more details.

您还可以在以前版本的 C++ 中将两个结构粘贴在同一个联合中,这可以保证能够以相同的顺序访问相同的数据成员(数据成员的“公共初始序列”)以访问不同的结构类型。

在这种情况下,是的,C 风格的演员表是等价的,但 reinterpret_cast 可能更惯用。

【讨论】:

  • 从链接的答案看来,在 C++11 之前的版本中,它似乎不是严格允许的,但“可能在实践中有效”。对我来说已经足够了!
  • 为了有一个“共同的初始序列”,成员的名字也必须相同。 (至少是正式的。)而且 g++ 有时会故意破坏原始帖子中的代码。这意味着标准禁止使用union,而g++禁止使用reinterpret_cast
猜你喜欢
  • 2021-07-23
  • 2018-05-20
  • 2016-02-05
  • 2013-10-30
  • 2015-05-17
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多