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返回数组引用,并且能够使用范围迭代语句?
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)
就沒問題了