Да. Там говорится «должны выполняться вот эти условия». То условие, что вы подчеркнули, первое в списке. Дальше идут еще несколько условий. В самом конце параграфа говорится «Если определения D удовлетворяют всем этим требованиям, программа должна вести себя так, как если бы сущность D была определена один раз. Если определения D не удовлетворяют этим требованиям, поведение не определено.»
Именно о последнем предложении и говорится в посте. Определения D не удовлетворяют тем требованиям, поэтому поведение не определено.
Это нарушение стандарта, а не ODR. Поскольку inline-функции с одинаковой сигнатурой должны иметь одинаковые реализации в различных единицах трансляции. И то, что пример удачно компилируется, является скорее отступлением компилятором MSVC от стандарта.
Это не нарушение стандарта и не отступление от стандарта. Стандарт говорит, что в этом случае поведение не определено. Соответственно, никаких ограничений не накладывается.
Все попытки «объяснить» неопределенное поведение — пустая трата времени.
Вся кухня с выявлением множественных символов работает только для не-inline функций. К inline функциям эта кухня не применяется. Об этом первые четыре абзаца. Так что да, вы правы насчет множественных символов, межмодульной оптимизации и ключей типа muldefs, но все это не имеет никакого отношения к предмету поста.
Более того, комментарий ниже, в общем полностью справедлив, но не очень полно сформулирован. Если о какой-либо ситуации в стандарте говорится «поведение не определено», то все попытки «объяснить», «доказать» или «обосновать» действия компилятора и поведение программы обречены — в лучшем случае после кропотливого анализа всех исходников конкретного компилятора и C++ runtime вы сможете сделать вывод о конкретной версии компилятора и C++ runtime. Эти выводы будут справедливы только для этой версии. Стоит обновить компилятор или runtime или перейти на другой компилятор — и «анализ» нужно проводить заново. Естественно, код с неопределенным поведением автоматически оказывается непереносимым между разными компиляторами и разными реализациями C++ runtime. Оно того не стоит.
Простое совпадение — в одном заголовке один разработчик написал функцию с какой-то сигнатурой и каким-то именем, в другом другой разработчик — другую функцию с теми же сигнатурой и именем. Это крайне маловероятно, если использовать разумный подход к выбору имен функций, но тем не менее возможно.
Да, /W4 в сочетании c /WX помогает найти кучу проблем. Например, C4930 — такой дефект легко посадить, не так-то просто заметить, а последствия крайне неприятные.
Это лучше спросить у менеджера, с которым будете работать. Цена зависит от большого количества параметров: количества страниц, которые планируете обрабатывать в месяц, количество точек ввода, территориальная распределенность системы, необходимость дорабатывать шаблоны под ваши задачи. Пытаться это прикидывать наобум – бессмысленно.
В первой версии переносить слова нужно будет с помощью Copy/Paste, в следующих версиях планируется сделать импорт слов из Лингво в Тьютор по нажатию на специальную кнопку.
Именно о последнем предложении и говорится в посте. Определения D не удовлетворяют тем требованиям, поэтому поведение не определено.
Это не нарушение стандарта и не отступление от стандарта. Стандарт говорит, что в этом случае поведение не определено. Соответственно, никаких ограничений не накладывается.
Все попытки «объяснить» неопределенное поведение — пустая трата времени.
Более того, комментарий ниже, в общем полностью справедлив, но не очень полно сформулирован. Если о какой-либо ситуации в стандарте говорится «поведение не определено», то все попытки «объяснить», «доказать» или «обосновать» действия компилятора и поведение программы обречены — в лучшем случае после кропотливого анализа всех исходников конкретного компилятора и C++ runtime вы сможете сделать вывод о конкретной версии компилятора и C++ runtime. Эти выводы будут справедливы только для этой версии. Стоит обновить компилятор или runtime или перейти на другой компилятор — и «анализ» нужно проводить заново. Естественно, код с неопределенным поведением автоматически оказывается непереносимым между разными компиляторами и разными реализациями C++ runtime. Оно того не стоит.
Возможность нажать на любое слово в статье и получить его перевод планируется добавить в следующих версиях программы.