В С++ Primer указано, что
В С++ указатели и массивы тесно переплетаются. В частности, поскольку хорошо видеть, , когда мы используем массив, компилятор обычно преобразует массив к указателю.
Я хотел использовать итераторы для печати массива. Программа ниже работает нормально, но когда я пытаюсь напечатать arr2 или arr3, если я не ошибаюсь, что имеет тип int *, я получаю сообщение об ошибке (судя, что оператор и оператор ссылается ниже).
error: no matching function for call to ‘begin(int*&)’
int main(int argc, char** argv) {
int arr[] = {0,1,2,3,4,5,6,7,8,9};
auto arr2 = arr;
auto arr3(arr); // I think arr2 and arr3 are of same type
for(auto it = std::begin(arr) ; it != std::end(arr) ; ++it)
std::cout << *it << " ";
std::cout << std::endl;
return 0;
}
Учитывая утверждение, если массив преобразован в указатель компилятором, как эта программа работает для печати содержимого arr с помощью std::begin() и std::end() и не работает для arr2 или arr3 если все они являются указателями на целые числа?
Edit
Простите, если я не могу это прояснить. Надеюсь, что я разъясню проблему с помощью этого редактирования.
Теперь, когда я знаю, что begin() и end() не будут работать с указателями (спасибо ответам), мне интересно, не цитируется ли цитируемый текст, поскольку он указывает, что существует Array → Указатель. Если какой текст говорит true, то тип arr должен быть указателем. Есть ли проблема с цитируемым текстом в этот момент?
Кроме того, есть ли способ, которым я могу использовать begin() и end() для указателей (а не контейнеров STL) с указанием размера, возможно, используя следующий конструктор?
template< class T, size_t N >
T* begin( T (&array)[N] );