Подтвердить что ты не робот

Почему встроенные функции имеют внешнюю связь по умолчанию?

В стандарте говорится, что при объявлении

inline void foo();

что foo является встроенной функцией с внешней привязкой (потому что по умолчанию все объявления функций имеют внешнюю привязку). Мне это кажется странным. потому что одно правило правила 3.2 (как на С++ 03, так и на С++ 11):

3... Встроенная функция должна быть определена в каждой единицы перевода, в которой она используется.

5 Могут быть более одного определения встроенной функции [n]... с внешней связью (7.1.2)... Учитывая такой объект с именем D, определенный более чем в одной единицы перевода... каждое определение of D состоит из одной и той же последовательности токенов

Это означает, что встроенная функция может также иметь внутреннюю связь, поскольку использование функции каким-либо образом через внешнюю связь (то есть между единицами перевода) будет ссылаться на поведение undefined (в соответствии с пунктом 3) и что содержание встроенной функции во всех единицах перевода должно быть одинаковым.

Есть ли обратная совместимость или конкретная причина привязки этого правила?

4b9b3361

Ответ 1

Одним из результатов этого решения является то, что статическая переменная, определенная внутри встроенной функции, будет разделяться между всеми экземплярами функции. Если по умолчанию была внутренняя связь, каждая единица перевода получила бы свою собственную копию статической переменной. Это не то, как люди ожидают, что работа будет работать - встроенная и не-встроенная не должны влиять на семантику кода так резко.

Ответ 2

Это метко ответил здесь статья Джонатана Шиллинга: Extern Inlines по умолчанию.

Процитировать его о мотивации для этого изменения:

Непосредственной мотивацией для этого изменения была необходимость новой модели компиляции шаблонов, которая была принята на том же заседании; но в целом было высказано мнение о том, что изменение дефолта было идеей, чье время наступило, и это изменение было единогласно одобрено как в ANSI, так и в ISO.