Необязательный бросок в constexpr? - PullRequest
0 голосов
/ 05 мая 2018

Я изучал, как реализовать strlen времени компиляции для игрушечного проекта в этом репо https://github.com/elbeno/constexpr, когда заметил необычный шаблон бросков в некотором коде. Казалось бы, ничего не делает, зачем ты это делаешь?

namespace err {
    extern const char * strlen_runtime_error;
}
constexpr int strlen(const char * str) {
    return true ? constexpr_func() : throw strlen_runtime_error;
}

Мне стало любопытно, имеет ли это какое-либо применение, но я не смог найти ничего полезного для себя. Внешняя ошибка не определена.

1 Ответ

0 голосов
/ 05 мая 2018

Кажется, он пытается принудительно использовать функцию, используемую только во время компиляции, согласно этому комментарию в другой функции библиотеки:

// convenience function for inferring the string size and ensuring no
// accidental runtime encryption
template <uint64_t S, size_t N>
constexpr encrypted_string<S, N> make_encrypted_string(const char(&s)[N])
{
  return true ? encrypted_string<S, N>(s) :
    throw err::strenc_runtime_error;
}

Однако, как вы указываете, здесь ничего не происходит. Как правило, этот трюк с троичным оператором в функциях constexpr используется для запуска ошибок времени компиляции с заданным условием - чтобы не гарантировать, что все вызовы функции являются константными выражениями. См. ошибка constexpr во время компиляции, но не издержки во время выполнения для объяснения этого паттерна.

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

constexpr int result = strlen("asd");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...