Есть два важных аспекта для отладки constexpr
функций.
1) Убедитесь в том, что вычислить правильный результат
Здесь Вы можете использовать обычный юнит-тестирование, утверждает или во время выполнения отладчика для пошагового выполнения кода. Нет ничего нового по сравнению с тестированием регулярных функций здесь.
2) Убедитесь в том, что они могут быть оценены во время компиляции
Это может быть проверена путем оценки функции в качестве правой стороны constexpr
присваивания значения переменной.
constexpr auto my_var = my_fun(my_arg);
Для того, чтобы это работало, my_fun
может а) только во время компиляции константного выражения в качестве фактических аргументов. То есть my_arg
является литералом (встроенным или определяемым пользователем) или ранее вычисленной переменной constexpr
или параметром шаблона и т. Д., И b) он может вызывать только функции constexpr
в своей реализации (поэтому нет виртуальных, не лямбда-выражений и т. Д.).
Примечание: очень сложно фактически отлаживать реализацию компилятора генерации кода во время оценки времени компиляции вашей функции constexpr
. Вам нужно будет подключить отладчик к вашему компилятору и фактически иметь возможность интерпретировать путь кода. Возможно, какая-то будущая версия Clang позволит вам сделать это, но это невозможно для текущей технологии.
К счастью, поскольку вы можете отделить время выполнения и время компиляции constexpr
, отладка их не так сложна, как отладка шаблонов метапрограмм (которые могут выполняться только во время компиляции).
Так же, как вы отлаживаете шаблоны метапрограмм :-) –
Также обратите внимание, что 'constexpr' функции не имеют * *, которые должны быть оценены статически. Если вы предоставляете аргумент non-constexpr, у вас есть обычный вызов функции, который вы должны уметь отлаживать. –
Я не понимаю, в чем проблема ... – Mehrdad