Почему многие стандартные реализации позволяют напрямую присваивать значение ostream_iterator? - PullRequest
1 голос
/ 10 марта 2012

Все стандартные реализации, которые я пробовал, позволяют присваивать значения std::ostream_iterator без их разыменования перед присваиванием. Хотя стандартные алгоритмы разыменовывают итераторы перед присваиванием, я хотел бы знать, почему существуют реализации, которые не просто запрещают присваивание статически (с помощью прокси-класса), так что компиляция просто не удалась бы, так что пользователь знает, что что-то не так может произойти, если такое назначение перенесено в другую реализацию, не позволяющую назначение по некоторым причинам. В целом, при реализации стандартной функциональности целесообразно ли ограничивать реализацию только тем, что прямо указано в стандарте?

#include <iterator>
#include <string>
#include <iostream>

using namespace std;

int main() {
    ostream_iterator<string> o(cout);
    o = "Hello World\n"; // o is not dereferenced! It compiles with my GCC environment
    o++; // to make sure the implementation writes to cout
}

Ответы [ 2 ]

1 голос
/ 10 марта 2012

Потоковые итераторы на самом деле просто фальшивые итераторы. Вставка происходит при назначении для ostream_iterator, а извлечение происходит при разыменовании для istream_iterator. operator*() для ostream_iterator фактически задано как неактивное, чтобы просто вернуть *this.

1 голос
/ 10 марта 2012

Перегрузка оператора, разрешающая это назначение, определяется стандартом языка C ++.Таким образом, реализация Стандартной библиотеки C ++ должна предоставить ее.

Перегрузка определяется следующим образом (из C ++ 11 §24.6.2.2 / 1):

ostream_iterator& operator=(const T& value);

Эффект:

*out_stream << value;
if(delim != 0)
    *out_stream << delim;

return (*this);

(T - это T, с которым был создан экземпляр ostream_iterator. В вашем примере это string.)

...