Это эквивалентные определения классов, за исключением целей Единого определения.Таким образом, стандарт не гарантирует, что вы можете скомпилировать один TU (единицу перевода) с одним определением класса и другой TU с другим, а затем связать их вместе.Я сомневаюсь, что в реальной реализации это когда-либо закончится неудачей, но об этом говорится в стандарте.
Ключевое слово inline
не имеет никакого отношения к встраиванию.Речь идет о том, разрешено ли несколько идентичных определений функции в разных TU.Если кто-то перемещает определение функции в другое место, он должен решить, следует ли пометить его inline
на следующей основе:
Если оно находится в файле .cpp
для этого класса, тодопустимо пометить его inline
, если он вызывается только из этого TU.Тогда, вероятно, не имеет значения, помечен ли он inline
или нет, но вы можете пометить его inline
как подсказку компилятора, если считаете, что компилятор будет обращать внимание на то, что вы хотите.
Если он все еще находится в заголовочном файле, то он должен быть помечен inline
, иначе вы получите несколько ошибок определения при связывании разных TU, использующих заголовок.
Предполагая, что человек, перемещающий функцию, знает эти вещи, я не думаю, что им нужно напоминание в определении класса.Если они не знают этих вещей, то, вероятно, им не стоит переставлять функцию, но для них было бы безопаснее иметь ключевое слово inline
, чтобы перемещаться вместе с ним.