C ++ форсировать контекст non constexpr - PullRequest
0 голосов
/ 19 января 2019

У меня есть функции, которые объявлены с помощью спецификатора constexpr, и я уже проверял, что они оцениваются во время компиляции в модульных тестах.

Теперь я хочу использовать дезинфицирующие средства с моим модульным тестом, чтобы найти еще больше проблем. Но так как большая часть моих функций указана с помощью constexpr, я не уверен, как это сделать, потому что, если функция оценивается во время компиляции, дезинфицирующие средства бесполезны или нет?

Есть ли способ заставить функцию constexpr не оцениваться во время компиляции. Или у вас есть другие рекомендации.

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Есть ли способ заставить функцию constexpr не оцениваться во время компиляции [?]

Если вы можете изменить функцию constexpr, добавив неиспользуемый параметр, выможет заставить оценку во время выполнения передать значение времени выполнения.

Я имею в виду ... предположим, что у вас есть следующая constexpr функция

constexpr int getVal ()
 { return 0; }

, которую вы можете использовать следующим образом

constexpr auto a = getVal();

auto b = getVal();

и (игнорируя правило "как есть") вы уверены, что getVal() вычисляется при инициализации времени компиляции a, но вы не знаете, вычисляется ли он во время компиляции или во время выполненияинициализация b.

Но если вы измените функцию следующим образом

constexpr int getVal (int)
 { return 0; }

, вы можете написать

   int c = 1;

   constexpr auto a = getVal(0);

   auto b = getVal(c);

, теперь вы можете быть уверены, что getVal()вычисляемая инициализация во время компиляции a (потому что a - это constexpr, а 0 - литерал), и это вычисляемая инициализация во время выполнения b (потому что c не может использоваться в constexpr выражение).

Вы также можете проверить, что при записи

int c = 1;

constexpr auto a = getVal(c);

вы получите ошибку компиляциипричина a должна быть инициализирована во время компиляции, но getVal(c) не может быть вычислена во время компиляции.

0 голосов
/ 19 января 2019

Есть ли способ заставить функцию constexpr не оцениваться во время компиляции.

constexpr сообщает компилятору, что функция и все, что она вызывает, должны быть безопасны для оценки.Например, вы не можете сделать new или delete.Ограничения на constexpr означают, что многие ловушки, которые были созданы для дезинфекции, неявно избегаются.

Или у вас есть другие рекомендации.

Дезинфицирующие средстваоставаться полезным.Например, вы могли бы вызвать неопределенное поведение.То, что большая часть вашего кода является constexpr, не означает, что биты, которые не являются неявными, также являются безопасными.

...