Есть ли другой способ получить ссылку на массив из возвращаемой функции, за исключением использования указателя?Функция C++, возвращающая ссылку на массив
Вот мой код.
int ia[] = {1, 2, 3};
decltype(ia) &foo() { // or, int (&foo())[3]
return ia;
}
int main() {
int *ip1 = foo(); // ok, and visit array by ip1[0] or *(ip1 + 0)
auto ip2 = foo(); // ok, the type of ip2 is int *
int ar[] = foo(); // error
int ar[3] = foo(); // error
return 0;
}
И классная версия.
class A {
public:
A() : ia{1, 2, 3} {}
int (&foo())[3]{ return ia; }
private:
int ia[3];
};
int main() {
A a;
auto i1 = a.foo(); // ok, type of i1 is int *, and visit array by i1[0]
int i2[3] = a.foo(); // error
return 0;
}
Примечание: const
спецификатор опущен в коде.
Я знаю, что имя массива является указателем на первый элемент в этом массиве, поэтому использование указателя для получения является полностью жизнеспособным.
Извините, я допустил ошибку. Из Array to pointer decay
Существует неявное преобразование из lvalues и rvalues типа массива к rvalues типа указателя: он создает указатель на первый элемент массива.
Пожалуйста, игнорируйте, что XD
Я просто любопытно вопрос, я спросил в начале :)
Вы не можете копировать-инициализировать массивы. Возвращение ссылок на массивы - это красная селедка; это разрешено и отлично работает. –
имя массива не является указателем на первый элемент, но может быть неявно преобразовано в. Есть разница, и эта распространенная ошибка приводит к ошибкам. В любом случае вам лучше использовать 'std :: array', чтобы избежать путаницы. – Slava
* «Я знаю, что имя массива является указателем на первый элемент в этом массиве» * - это неправильно. Прочитайте [this] (http://en.cppreference.com/w/cpp/language/array#Array_to_pointer_decay). EDIT: Ах, Слава избил меня. Ссылка все еще хорошо читается. –