std :: is_constant_evaluated поведение

Если все, что вы хотели сделать, это повторить инструкции DML, которые могут работать очень хорошо, если у вас есть таблицы в целевом месте. Но если вы хотите, чтобы сценарий создавал таблицы и другие объекты, подавляющее большинство этих операторов терпят неудачу, если вы не вручную входите и не обновляете их для работы на SQL Server. Вы можете найти какую-то компанию, у которой есть инструмент, который пытается это сделать, и в некоторых случаях они могут быть в порядке для всех простых преобразований, но не справятся со всеми сложными вещами. В целом SQL Server и PostgreSQL - это два разных зверя, когда вы входите в детали, поэтому делать это автоматически будет сложно, не написав какой-либо инструмент для конвертации или не попытайтесь купить тот, который, вероятно, вы получите только от 60 до 80 процентов.

13
задан Barry 18 January 2019 в 14:53
поделиться

2 ответа

if constexpr требует постоянного выражения для условия. Поэтому is_constant_evaluated, конечно, всегда будет правдой в таком контексте.

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

0
ответ дан StoryTeller 18 January 2019 в 14:53
поделиться

Вот как я об этом думаю, может быть, вы найдете это полезным ... может быть, нет. Обратите внимание, что я думаю, что написание 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 - это особый случай, к сожалению, язык - вы можете использовать постоянные целочисленные переменные в качестве константных выражений, поэтому мы используем их инициализацию одинаково для этих целей.)

0
ответ дан Barry 18 January 2019 в 14:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: