Когда друзья пахнут? Они всегда пахнут?

Это пахнет?

class DatabaseImpl {
private:
    void _reallyWriteToDatabase(char*);
    friend class Database;
    friend class A; friend class B; friend class C; friend class D; };

Я думаю, что большинство их друзей пахнут. Почему другие друзья не могут просто использовать Database? Как вы думаете, Database тоже пахнет? Я не знаю.

Как насчет этого? У него есть друг. Они пахнут?

class A {
public:
    explicit A(int i) : data_(i) {}
    int getData() const { return data_; }
private:
    friend std::ostream& operator<<(const A& a, std::ostream& out) {
         return out << "A{" << a.data_ << "," << a.moreData_ "}\n";
    }
    int data_;
    int moreData_ = 23;
};

Хорошо или плохо? Я думаю, это нормально, но почему бы просто не сделать его функцией-членом? Какую гибкость это нам дает?

Что насчет этого"?

Функция friend на object_t придерживается формы других функций draw. При небольшом количестве кода, если различные задействованные типы соответствуют одной и той же концепции, их можно хранить как object_t в document_t и использовать для draw()

Еще много об этом здесь

Первоначально опубликовано на gist.github.com.