шаблоны — C ++ constexpr во время компиляции

Правильно ли я считаю, что эта функция должна оцениваться только во время компиляции, или это требует затрат времени выполнения?

template <typename T>
size_t constexpr CompID() {
return typeid(T).hash_code();
}

struct Foo {};

int main(int argc, const char * argv[]) {
size_t foo = CompID<Foo>();
return 0;
}

5

Решение

Функция constexpr позволяет оценивать функцию во время компиляции, но не требует этого, поэтому ваш ответ «возможно». Это зависит от настроек оптимизации компилятора.

§7.1.5 [dcl.constexpr] / 7

Вызов к constexpr Функция выдает тот же результат, что и вызов эквивалентногоconstexpr функция
во всех отношениях, за исключением того, что вызов constexpr Функция может появляться в постоянном выражении.

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

constexpr auto foo = CompID<Foo>();

Также обратите внимание, что type_info.hash_code() не может быть оценена во время компиляции (это не функция constexpr, §18.7.1 [type.info] / 7). Таким образом, ваш код на самом деле не так.

6

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector