在return语句中将指针强制转换为固定大小的数组

时间:2013-04-25 10:52:55

标签: c++ arrays

提出这个问题的最简单方法是使用一些代码:

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编译,as_array_ref没有。演员似乎是有序的,但我无法弄清楚合适的语法。有什么想法吗?

3 个答案:

答案 0 :(得分:7)

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

typedef int ints[3];

然后,您的as_array_ref必须写为&as_array_ref() == &x

以下语法是可能的:

  1. int*ints*的纯C式演员:

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

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

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

  3. int&投放到ints&这个稍微短一点,但(对我来说)不那么直观:

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

答案 1 :(得分:5)

您需要重新解释对变量的引用作为对数组的引用:

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

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

答案 2 :(得分:2)

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