10

The simplest way to ask this question is with some code:

struct Point
{
    int x;
    int y;
    int z;

    int* as_pointer() { return &x; }        // works
    int (&as_array_ref())[3] { return &x; } // does not work   
};

as_pointer compiles, as_array_ref does not. A cast seems to be in order but I can't figure out the appropriate syntax. Any ideas?

4

3 回答 3

11

我发现数组类型更容易处理 typedef:

typedef int ints[3];

那么你的as_array_ref必须写成这样&as_array_ref() == &x

以下语法是可能的:

  1. 普通的 C 风格转换从int*to ints*

    ints& as_array_ref() { return *( (ints*)(&x) ); }

  2. C++ 风格reinterpret_cast(@Mike Seymour 建议 - 另见他的回答)。在 C++ 中,它通常被认为是一种更好的做法:

    ints& as_array_ref() { return *reinterpret_cast<ints*>(&x); }

  3. Cast from which 稍微短一些,但(对我来说)不太直观int&ints&

    ints& as_array_ref() { return reinterpret_cast<ints&>(x); }

于 2013-04-25T11:00:37.333 回答
8

您需要将对变量的引用重新解释为对数组的引用的转换是:

reinterpret_cast<int(&)[3]>(x);

请注意,使用它会产生未定义的行为;它可能适用于任何合理的实现,但不能保证类成员之间不会有填充,而数组不会被填充。

于 2013-04-25T11:22:53.530 回答
2

我认为你想要做的事情会更容易(和更清晰/更清洁)与工会。

于 2013-04-25T11:05:29.890 回答