C++ 返回语句中固定大小数组的强制转换指针

C++ 返回语句中固定大小数组的强制转换指针,c++,arrays,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 }; 当指针编译时,当数组引用编译时不编译。演员阵容似乎已经准备好了,但我想不出合适的语法。有什么想法

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

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

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

当指针编译时,
当数组引用编译时
不编译。演员阵容似乎已经准备好了,但我想不出合适的语法。有什么想法吗?

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

typedef int ints[3];
然后必须编写
as\u array\u ref
,以便
和as\u array\u ref()==&x

以下语法是可能的:

  • int*
    int*
    的普通C样式转换:

    ints&as_数组_ref(){return*((ints*)(&x))}

  • C++风格
    重新解释演员阵容
    (由@Mike Seymour建议-另见他的答案)。在C++中,这通常被认为是一种更好的实践:

    ints&as_数组_ref(){return*reinterpret_cast(&x);}

  • int&
    转换为
    int&
    ,稍微短一些,但(对我来说)不太直观:

    ints&as_数组_ref(){return reinterpret_cast(x);}


  • 我认为,如果有一个联合体,您尝试做的事情会更容易(更清晰/更清晰)。

    您需要将变量引用重新解释为数组引用的类型是:

    reinterpret_cast<int(&)[3]>(x);
    
    reinterpret\u cast(x);
    

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

    很酷,很高兴我能提供帮助;)我宁愿看到C++风格<代码> RealTytCase,使事情变得更加明显。C型强制转换既危险又难于搜索。@ MikeSeymour:实际上它更像C++。我据此编辑了我的答案,谢谢。也是一个很好的建议,谢谢。我通常都会避开他们,所以我根本就没想过!我不确定cleaner:在这两种情况下,如果结构字段和数组恰好有不同的填充/对齐方式,它将不起作用。除非我弄错了,否则这两种解决方案都是危险的。所以你想让编译器假装
    x
    实际上是三个
    int
    s的数组?无法保证这会起作用;编译器可以以不同于布局数组的方式在数据成员之间添加填充。