cari

Rumah  >  Soal Jawab  >  teks badan

c++11 - C++函数中返回数组的引用

using namespace std;
int odd[]  = {1, 3, 5, 7, 9};
int even[] = {0, 2, 4, 6, 8};
decltype(odd) &arrPtr(int i)
{
    return (i % 2) ? odd : even;
}
int main()
{
    auto a = arrPtr(1);
    int b[] = {1, 2, 3, 4};
    int (&c)[4] = b;
    cout << typeid(a).name() << endl;
    cout << typeid(b).name() << endl;
    cout << typeid(c).name() << endl;
    for (int i = 0; i != 5; ++i)
        cout << a[i] << ' ';
    cout << endl;
}

看上面这段代码,其中arrPtr返回一个数组的引用,用来初始化a,b是一个数组,c是b的引用。

但是三者的typeid依次为:

Pi
A4_i
A4_i

此时a的类型检测为整形指针。

诡异的是遍历输出a中元素又能得到正确结果,但是如果用范围迭代for(auto i: a)语句又会报错,貌似是说a里面没有迭代器。

请问一下如何改写使得arrPtr返回数组引用,并且能够使用范围迭代语句?

怪我咯怪我咯2768 hari yang lalu647

membalas semua(1)saya akan balas

  • PHP中文网

    PHP中文网2017-04-17 11:28:37

    GCC 4.8.2和Clang3.4,实测没有问题,建议升级编译器。
    好吧我看错问题了,lz帖的代码是可以编译的,但是把for (int i = 0; i != 5; ++i)改成for (auto i: a)就不行了,原因是很显然的:

    auto x=(int[])&...中,auto不会生成一个引用类型,x不会是一个“数组的引用”,而是一个“指针”,所以后面的for loop当然不对。

    想写对也很容易,你把这一行改成auto &a=arrPtr(1),或者再麻烦点写成decltype(arrPtr(1)) a=arrPtr(1)就没问题了

    balas
    0
  • Batalbalas