¿El operador << debe implementarse como un amigo o como una función miembro?

Esa es básicamente la pregunta, ¿hay una forma "correcta" de implementaroperator<< ? Leyendoesta Puedo ver que algo así como:

friend bool operator<<(obj const& lhs, obj const& rhs);

se prefiere a algo como

ostream& operator<<(obj const& rhs);

Pero no puedo entender por qué debería usar uno u otro.

Mi caso personal es:

friend ostream & operator<<(ostream &os, const Paragraph& p) {
    return os << p.to_str();
}

Pero probablemente podría hacer:

ostream & operator<<(ostream &os) {
    return os << paragraph;
}

¿En qué razón debo basar esta decisión?

Nota:

 Paragraph::to_str = (return paragraph) 

donde el párrafo es una cadena

Respuestas a la pregunta(8)

Su respuesta a la pregunta