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的数组?无法保证这会起作用;编译器可以以不同于布局数组的方式在数据成员之间添加填充。