使用decltype声明返回类型

时间:2015-12-16 10:42:28

标签: 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]

     

返回一个指向五个int元素

的数组的指针      

错误:类型为“int (*)[5]”的值不能用于初始化“int *”类型的实体

为什么int*无法使用arrayPtr()来初始化我的返回值?我原以为编译器正在进行显式转换。

此外,什么会用作返回类型(最佳做法)?

2 个答案:

答案 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]
}