Информация об изменениях

Сообщение constexpr - разочарование от 13.06.2017 14:34

Изменено 13.06.2017 20:21 Bill Baklushi

constexpr - разочарование
Категорически приветствую!

Игрался с констэкспрами.

template <typename T>
constexpr int my_log2(T n)
{
    return n? 1+my_log2(n>>1): -1;
}

int main()
{
    return my_log2<unsigned>(42);
}


И VC, и G++ генерят обычные вызовы даже в релизе.
Вычисления в compile time производятся только если компилятор припереть к стенке,
напр. передать параметром в шаблоне:
template <int I> struct eval_im
{
    enum { value = I };
};


Это нормально?
Это как гордая птица ёж, которая без пинка не полетит.

Еще вопрос. Поскольку на constexpr функции накладываются ограничения, ее реализация бывает неэффективна.
Можно ли сделать две версии функции constexpr и не constexpr, но с одинаковым именем и списком параметров?
constexpr - разочарование
Категорически приветствую!

Игрался с констэкспрами.

template <typename T>
constexpr int my_log2(T n)
{
    return n? 1+my_log2(n>>1): -1;
}

int main()
{
    return my_log2<unsigned>(42);
}


И VC , и G++ генерят обычные вызовы даже в релизе.
Вычисления в compile time производятся только если компилятор припереть к стенке,
напр. передать параметром в шаблоне:
template <int I> struct eval_im
{
    enum { value = I };
};


Это нормально?
Это как гордая птица ёж, которая без пинка не полетит.

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