Учитывая, что имя массива неявно преобразуется в указатель на первый элемент, можно предположить, что такое:
int main()
{
string a[] = { "hello", " world", "!!!" };
copy(&a, &a+3, ostream_iterator<string>(cout, " "));
cout << endl;
}
...заработает. Но оно не работает если явно не указать индексы:
// ...
copy(&a[0], &a[0]+3, ostream_iterator<string>(cout, " "));
// ...
А я читал, что неявное преобразование имени массива в указатель работает всегда

What went wrong?
g++ 4.2.2
Здравствуйте, Myav, Вы писали:
M>M>int main()
M>{
M> string a[] = { "hello", " world", "!!!" };
M> copy(&a, &a+3, ostream_iterator<string>(cout, " "));
M> cout << endl;
M>}
M>
Ты словами напиши что этот код должен делать.
В частности что ты имеешь ввиду в этой строке:
copy(&a, &a+3, ostream_iterator<string>(cout, " "));
?
Зачем разыменовывать указатель?
Вот так всё работает (MSVC 2005):
std::string a[] = { "hello", " world", "!!!" };
std::copy(a, a+3, std::ostream_iterator<std::string>(std::cout, " "));
std::cout << std::endl;
M>А я читал, что неявное преобразование имени массива в указатель работает всегда
What went wrong?
Все дело в волшебных пузырьках — на словах вы сказали все верно, а вот написали не совсем то. Попробуйте:
int main()
{
string a[] = { "hello", " world", "!!!" };
copy(
a, a+3, ostream_iterator<string>(cout, " "));
cout << endl;
}
Здравствуйте, kostikov, Вы писали:
K>Зачем разыменовывать указатель?
K>Вот так всё работает (MSVC 2005):
K>K> std::string a[] = { "hello", " world", "!!!" };
K> std::copy(a, a+3, std::ostream_iterator<std::string>(std::cout, " "));
K> std::cout << std::endl;
K>
Да, амперсанд был лишним. Запечатался. Спасибо.