Учитывая две программы, где единственная разница в исходном коде - наличие или отсутствие одного constexpr
, возможно ли, что значение программы изменится?Можете добавить «constexpr» изменить поведение?
Другими словами, если бы существовал компилятор, чтобы попросить компилятор попытаться действительно усложнить вывод, если это возможно, может ли он нарушить существующий стандартный код и/или изменить его значение в плохих отношениях?
Представьте, что вы имеете дело с кодовой базой, в которой первоначальный разработчик забыл включить constexpr
в места, где это было возможно, возможно, код написан до C++ 11. Было бы здорово, если бы компилятор вывел constexpr
, чтобы помочь вам справиться с вашей работой. Конечно, возможно, он также должен предупреждать каждый раз, когда он делает это заключение, и побуждает вас явно добавить constexpr
. Но это было бы полезно. Мое беспокойство в том, что это может нарушить ситуацию?
До сих пор я могу думать только о том, что функции constexpr
неявно inline
, и могут быть ситуации, когда добавление inline
может изменить ситуацию в плохом режиме; например, если вы нарушите правило с одним определением.
Ну, например, если поставщики компилятора решили отмечать функции, не отмеченные в стандарте как constexpr, которые могут вызвать различное поведение через SFINAE, поэтому именно это было в конечном итоге не разрешено, см. [Является ли это совместимым расширением компилятора для обработки не- -constexpr стандартная библиотека выполняет функции constexpr?] (http://stackoverflow.com/q/27744079/1708801) –
Спасибо за это @ShafikYaghmour. Я провел некоторые эксперименты с SFINAE, чтобы попытаться найти расхождение, но я не мог. Я думаю, что мои примеры были слишком упрощенными :) –
У меня есть [пример, где SFINAE прерывается] (http://stackoverflow.com/a/21319414/1708801) из-за различных методов обработки неопределенного поведения в постоянных выражениях. У меня все еще нет ответа, считается ли это подходящим или нет. Не совсем то же самое, но мы можем видеть, как разные реализации могут разорвать SFINAE. –