Ответ 1
inline
имеет два значения в стандарте С++.
Первое, о чем вы думаете, когда слышите inline
; взяв код в функции и введя его в место, где он вызывается.
Стандарт С++ рекомендует реализации для этого, когда они видят метод или функцию inline
, но не требуют этого. Поскольку такое действие имеет нулевые наблюдаемые изменения поведения в абстрактной машине, которые описывает стандарт С++, я считаю это ненормативным советом.
Вторая связана с привязкой. Функция inline
(или в С++ 17 переменная) может существовать в нескольких единицах перевода. Обычно это вызывает ошибку во время соединения; но когда переменная или функция inline
, вместо этого все, кроме одного из экземпляров переменной или функции, молча отбрасываются. Если они отличаются каким-либо важным способом, это делает вашу программу плохо сформированной, не требуя диагностики.
Это второй смысл, почему неявные ctors и dtors неявно встроены; это означает, что ни одна единица перевода не должна выбираться для того, чтобы "жить". Вместо этого они генерируются везде, где они необходимы. Они могут быть преимущественно привязаны к вызывающему коду, но самое главное, если какие-либо рудиментарные копии его все еще существуют (потому что это не было написано, скажем), во время ссылки ошибка не возникает, и вместо этого все, кроме одного, отбрасываются.
См. inline в стандарте С++. Формулировка в стандарте немного сложнее понять, другая и более точная, чем я использовал выше.