В С++ 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] );