« Что бы сказал эксперт по ООП ... » Это в основном зависит от того, насколько он опытен в C ++, что - по своей собственной спецификации - не является (и не хочет быть) языком для пуриста.
ООП зилоты не используют С ++ (они предпочитают Smalltalk и любят Java).
Зелоты функционального программирования не используют C ++ (они предпочитают LISP и его наследников)
Большинству экспертов ООП не нравятся функции друзей просто потому, что они хотят, чтобы ООП-часть C ++ вела себя как Smalltalk. Но C ++ - это не Smalltalk, и они даже не могут понять, что друг не нарушает инкапсуляцию , по той простой причине, что функция не может быть другом вашего класса без вашего класса .
И с точки зрения «функциональности», между a.fn(b)и fn(a,b)нет никакой разницы (где fnдруг): вовлеченные стороны одинаковы. Проще говоря, один синтаксис может быть более подходящим, чем другой: если fn является коммутативным относительно aи b, fn(a,b)вероятно, более подходящим, чем тогда a.fn(b)(где взгляды имеют «особую роль», которой на самом деле это не так).