Если все, что вы хотели сделать, это повторить инструкции DML, которые могут работать очень хорошо, если у вас есть таблицы в целевом месте. Но если вы хотите, чтобы сценарий создавал таблицы и другие объекты, подавляющее большинство этих операторов терпят неудачу, если вы не вручную входите и не обновляете их для работы на SQL Server. Вы можете найти какую-то компанию, у которой есть инструмент, который пытается это сделать, и в некоторых случаях они могут быть в порядке для всех простых преобразований, но не справятся со всеми сложными вещами. В целом SQL Server и PostgreSQL - это два разных зверя, когда вы входите в детали, поэтому делать это автоматически будет сложно, не написав какой-либо инструмент для конвертации или не попытайтесь купить тот, который, вероятно, вы получите только от 60 до 80 процентов.
if constexpr
требует постоянного выражения для условия. Поэтому is_constant_evaluated
, конечно, всегда будет правдой в таком контексте.
Он предназначен для обычного if
. Цель состоит в том, чтобы не входить в путь кода, который недопустим в функции constexpr
при оценке в константном выражении. Но чтобы он выполнялся во время выполнения. Это не для того, чтобы полностью исключить эти пути кода из функции.
Вот как я об этом думаю, может быть, вы найдете это полезным ... может быть, нет. Обратите внимание, что я думаю, что написание if constexpr (std::is_constant_evaluated())
будет действительно распространенной ошибкой, и в нее легко попасть. Но, надеюсь, компиляторы просто диагностируют этот случай.
По сути, у нас есть два разных правила для кода - типичные правила для нормального кода времени выполнения и ограничения для константных выражений, которые применяются для программирования constexpr
. Это ограничения expr.const: нет UB, нет reinterpret_cast
и т. Д. Эти ограничения продолжают уменьшаться от языкового стандарта к языковому стандарту, и это здорово.
По существу, поток управления (с точки зрения пути кода) чередуется между режимом «полного времени выполнения» и режимом constexpr
. Как только мы войдем в режим constexpr
(будь то инициализация объекта constexpr
или оценка параметра шаблона или ...), мы останемся там, пока не закончим ... и затем вернемся к полному режиму выполнения.
Что is_constant_evaluated()
делает просто: я в режиме constexpr? Он сообщает вам, если вы находитесь в контексте, который требует константных выражений.
С этой точки зрения, давайте посмотрим на if constexpr (is_constant_evaluated())
. Независимо от того, в каком состоянии мы были, if constexpr
требуется постоянное выражение в качестве инициализированного, так что это переводит нас в режим constexpr, если мы еще не были там. Следовательно, is_constant_evaluated()
просто верно - безусловно.
Однако, для if (is_constant_evaluated())
, простой if
не меняет наше состояние между временем выполнения и constexpr. Таким образом, значение здесь зависит от контекста, из которого он был вызван. Инициализация test4
переводит нас в режим constexpr, потому что это объект constexpr. Во время его инициализации мы следуем правилам константных выражений ... поэтому is_constant_evaluated()
верно. Но как только мы закончим, мы вернемся к правилам времени выполнения ... поэтому при инициализации test5
, is_constant_evaluated()
ложно. (И затем test6
- это особый случай, к сожалению, язык - вы можете использовать постоянные целочисленные переменные в качестве константных выражений, поэтому мы используем их инициализацию одинаково для этих целей.)