Поскольку с auto m
вы передаете (массив) элементы по значению / копии в цикле на основе диапазона:
for (auto m : ar) { // pass by value
std::cout << &m << ' '; // prints addresses of copies, not the actual array elements
}
Это означает, что m
становится копией элемента массива в каждой итерации и имеет свой собственный адрес в памяти.
Если вы проходите по ссылке (auto& m
) или по ссылке на const (const auto& m
), вы увидите ожидаемые результаты:
for (auto& m : ar) { // pass by reference
std::cout << &m << ' '; // prints addresses of the actual array elements
}
Теперь m
- это фактический элемент массива, а &m
представляет ожидаемый адрес элемента массива.