Нет, не следует, то есть вторая версия верна.
friend
может использоваться только внутри определения класса (оно не имеет смысла вне его), и компилятор ищет сигнатуру функции, чтобы найти определение функции friend
, объявленной в вашем классе X
.
inline
используется в заголовочных файлах (хотя, я думаю, технически возможно использовать его и в файле cpp, но в этом нет никакого смысла). И обратите внимание, что inline
имеет смысл, только если вы на самом деле определяете функцию прямо здесь - это может не иметь никакого эффекта, если вы предоставите определение функции отдельно, в файле cpp.
Смысл inline
состоит в том, чтобы намекнуть компилятору, что рассматриваемая функция может быть встроена (однако это не гарантия - компилятор может решить, будет ли он встроен в эту функцию или нет). Если функция встроена, любые обращения к ней заменяются копией тела функции. Это практически всегда делается для повышения производительности, для экономии затрат на вызовы функций, за счет потенциально увеличивающегося размера программы. Теперь, если мы хотим встроить функцию, мы хотим, чтобы она была встроена повсюду, а не только в пределах одного модуля компиляции; вот почему не имеет смысла использовать ключевое слово inline
внутри файла реализации.