Почему встроенные функции имеют внешнюю связь по умолчанию? - PullRequest
18 голосов
/ 16 февраля 2012

Стандарт гласит, что с учетом декларации

inline void foo();

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

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

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

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

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

Ответы [ 2 ]

18 голосов
/ 16 февраля 2012

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

9 голосов
/ 16 февраля 2012

На этот вопрос метко отвечает статья Джонатана Шиллинга: Внешние строки по умолчанию .

Чтобы процитировать его о мотивации этого изменения:

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

...