c++ - 使用 decltype 声明返回类型

标签 c++ pointers decltype

我有以下代码片段:

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/

相关文章:

c - 当输入无效时如何递归要求输入?

c++ - decltype 说明符的用途

c++ - 是否有 decltype 的快捷方式

c++ - 获取函数的 decltype

c++ - 逐字读取多个空格的文件c++

c++ - 用模板类复制成员函数

c++ - 具有继承属性的 Boost Spirit 解析器 - 简单示例无法编译

c++ - 使用epoll_wait时如何正确读取数据

C++ 指针声明和赋值

c - 在列表的开头插入节点