Я считаю, что цель стандарта всегда состояла в том, чтобы сделать функцию inline
возможной, имея хотя бы одно объявление, включающее спецификатор inline
, но существовала некоторая неопределенность относительно того, когда было слишком поздно добавлятьпервая inline
декларация.Было ли это после определения слишком поздно или после первого вызова?
Я рассуждаю по этому поводу в два раза, сначала примеры в 7.1.1, хотя и ненормативные и, в основном, о спецификаторах классов хранения, предполагают, что inline
не требуется в каждом объявлении.
Во-вторых, этот отчет о дефектах DR 317 от 2001 г. (проголосовал в 2005 г.), в котором добавлено «Если определение функции появляется в переводческой единицедо ее первого объявления в качестве встроенной, программа является плохо сформированной ".предложение.Из разговора ясно, что предполагалось, что inline
не требуется для каждого объявления, особенно в случае функции-члена, определенной явно inline
, но вне тела класса, где исходное объявление не имелоявный inline
.
(В этом отчете о дефектах также содержится моя мантра о том, что inline
«больше, чем подсказка».)
Конечно, как только функция с внешней связью встроенная функция из-за одного или нескольких объявлений, включающих спецификатор inline
в одной единице перевода, она должна быть объявлена inline
во всех единицах перевода в соответствии с остальной частью параграфа 7.1.2 / 4.
В примере, приведенном в вопросе, я считаю, что намерение состоит в том, что foo
является встроенной функцией и является допустимым кодом, хотя мне кажется, что нормативный текст стандарта менее ясен, чем мог бы быть.