Мои $ .02:
Это нарушает ODR?
Строго говоря, я полагаю, да, но на практическом уровне это, вероятно, не имеет значения, особенно с конкретной ссылкой на constexpr
.
Если функция объявлена как constexpr
, то компилятор гарантированно сгенерирует постоянную времени компиляции, поэтому тело функции никогда не нужно генерировать, и все.
Для TU, скомпилированных с C ++ 11, ODR будет удовлетворен для всех этих TU, но я все равно ожидал бы, что результат вызова функции будет постоянной времени компиляции (поскольку очевидно, что семантика не изменилась и компилятор может генерировать эту константу при компиляции для C ++ 14, так почему же это не может быть здесь?).
Другими словами, constexpr
не говорит компилятору «скомпилировать этот код как константу времени компиляции» (компилятор всегда будет делать все возможное, чтобы сделать это в любом случае). Вместо этого он говорит: «скажи мне, если не сможешь», и, следовательно, гарантирует потребителям то, к чему применяется constexpr
, что на самом деле это то, что он утверждает.
Является ли здесь ODR бессмысленным, поскольку стандартный документ относится только к стандарту на одном языке и не определяет совместимость между стандартами?
Может быть, мы просто немного изменили правила.
Влияет ли constexpr на искажение имени функции?
как классификатор возвращаемого значения? Нет.
Должен ли я ожидать, что найдутся версии таких функций для C ++ 11 и C ++ 14, когда конечная программа связана, или я должен ожидать, что, если они встроены, компоновщик выберет либо C ++ 11, либо Версии C ++ 14, и они будут одинаковыми, если единственное отличие - аннотация constexpr?
Как я полагаю, мы уже установили, что не будет никаких функциональных тел, и можно ожидать, что константы времени компиляции, сгенерированные обеими версиями, будут одинаковыми. Я также ожидал бы, что сгенерированный код будет таким же, так как constexpr
ничего не добавляет к тому, что компилятор уже выяснил для себя.
Должен ли я ожидать, что подобные программы (в зависимости от одной и той же библиотеки при разных языковых стандартах, где аннотации constexpr могут различаться в зависимости от используемого языкового стандарта) "сработают", и эта схема компиляции одних и тех же заголовков в разных языковых стандартах как незначительный технический долг или эту ситуацию следует рассматривать как ошибку?
Учитывая вышесказанное, я ожидаю, что это сработает. -std=C++x
больше о том, какой синтаксис компилятор примет и не примет, чем что-либо еще (хотя, очевидно, есть исключения). Посмотри на это. Если бы вы не могли смешивать и сопоставлять библиотеки так, как вы описали, поставщики компиляторов были бы очень непопулярными, поэтому я полагаю, что они потратили время, чтобы обеспечить, насколько это возможно, Вы можете.
А как же noexcept
. Что ж, если компилятор просто генерирует константы времени компиляции по всем направлениям, то очевидно, что ни одна из этих функций не может сработать, поэтому я думаю, что мы можем забыть об этом здесь.
Как проверить предположения, сделанные в этом посте
Запустите какую-нибудь тестовую программу и проверьте код на Godbolt для C ++ 14 и C ++ 11. Я не могу сделать это отсюда, потому что это непригодно для планшета: (