我有以下代码片段:
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]
returns a pointer to an array of five int elements
Error: a value of type "
int (*)[5]
" cannot be used to initialize an entity of type "int *
"
为什么不能使用 int*
来初始化我从 arrayPtr()
返回的值?我会假设编译器正在进行显式转换。
此外,什么会用作返回类型(最佳实践)?
最佳答案
似乎 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];
关于c++ - 使用 decltype 声明返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34309853/