我有以下代码段:
int odd[] = { 1,3,5,7,9 };
int even[] = { 0,2,4,6,8 };
// returns a pointer to an array of five int elements
decltype(odd) *arrPtr(int i) {
return (i % 2) ? &odd : &even; // returns a pointer to the array
}
int main()
{
int *res1 = arrPtr(3);
decltype(odd) *res2 = arrPtr(3);
auto res3 = arrPtr(3);
}
对于第一行,我收到以下错误消息:
int (*arrPtr(int i))[5]
返回一个指向五个int元素
的数组的指针错误:类型为“
int (*)[5]
”的值不能用于初始化“int *
”类型的实体
为什么int*
无法使用arrayPtr()
来初始化我的返回值?我原以为编译器正在进行显式转换。
此外,什么会用作返回类型(最佳做法)?
答案 0 :(得分:3)
似乎odd
被声明为int
:
int odd[5];
odd
的类型为int[5]
,并将此数组的地址(或添加*
至decltype(odd)
)生成int(*)[5]
。看来,你实际上想要使用 decayed 类型的odd
:
decltype(+odd) arrPtr(int i) {
return i % 2? odd: even;
}
int main() {
int* res1 = arrPtr(3);
decltype(+odd) res2 = arrPtr(3);
auto res3 = arrPtr(3)
}
注意这种使用一元+
会强制数组衰减成为指向数组第一个元素的指针。
如果你真的想要返回一个指向数组的指针,你需要在捕获结果时使用合适的类型(假设原始实现):
int (*res1)[5] = arrPtr(3);
decltype(odd)* res2 = arrPtr(3);
auto res3 = arrPtr(3);
注意,这是一个指向5 int
数组的指针,即你可以使用
(*res1)[3];
或
res1[0][3];
答案 1 :(得分:1)
int (&)[5]
可能会衰减到int *
,而int (*)[5]
则不然。
您可以将代码更改为
decltype(odd)& arrPtr(int i) {
return (i % 2) ? odd : even; // returns the reference to the array
}
然后
int main()
{
int *res1 = arrPtr(3);
decltype(odd)& res2 = arrPtr(3); // int (&)[5]
auto res3 = arrPtr(3); // int*
const auto& res4 = arrPtr(3); // const int (&)[5]
}