Цель inline
состоит в том, чтобы разрешить определение функции в нескольких единицах перевода, что необходимо для того, чтобы некоторые компиляторы могли встроить их там, где они используются. Его следует использовать всякий раз, когда вы определяете функцию в файле заголовка, хотя вы можете опустить ее при определении шаблона или функции внутри определения класса.
Определение его в заголовке без inline
- очень плохая идея; если вы включаете заголовок из нескольких единиц перевода, тогда вы нарушаете правило одного определения; ваш код, вероятно, не будет ссылаться и может проявлять неопределенное поведение, если это произойдет.
Объявление его в заголовке с inline
, но определение его в исходном файле также является очень плохой идеей; определение должно быть доступно в любой единицы перевода, которая его использует, но определяя его в исходном файле, он доступен только в одной единицы перевода. Если другой исходный файл содержит заголовок и пытается вызвать функцию, то ваша программа недействительна.
Что вы подразумеваете под «TU» и «ODR»? – WiSaGaN
@WiSaGaN: TU = единица перевода: грубо, предварительно обработанный исходный файл. ODR = одно правило определения: требуется, чтобы все определения функции/класса были идентичны на уровне символов через TU. –
На уровне персонажа или уровне маркера? – fredoverflow