Функция увеличивает или уменьшает экспоненту числа на значение power, что равносильно возведению числа 2 в эту степень.
Функция собирается только с с++14.
Можно как-то преобразовать данную функцию, чтобы она собиралась под с++11?
Как правильно приводить типы в 3 строке, чтобы убрать предупреждение компилятора warning: dereferencing type-punned pointer will break strict-aliasing rules?
Ругается на неинициализированную переменную error: uninitialized variable ‘tmp’ in ‘constexpr’ function
Попробую с memcopy.
А чтоб с с++11 собрать варианты есть?
Можно, конечно. Проблема в том, что в С++11 constexpr функция обязана состоять только из одного оператора return. Надо просто переписать функцию таким образом. Перепишете? Или показать?
Правильно - никак, т.к. такое преобразование является нарушением правил strict-aliasing. Можно, конечно, обмануть, чтобы заткнулась (но это неправильно!). Ну, или просто отключить strict-aliasing (если оно у вас отключается), что честнее
в твоем случае достаточно просто отключить этот варнинг в компиляторе. компилятор ругается, что из-за такого приведения типов он не может в полную развернуться в смысле оптимизации.
Вариант 1 я сам пробовал, у меня не собрался. Компилятор ругался, что выражение не и является lvalue и получить его адрес не удается.
Вариант 2 вечером попробую. Должен собраться.
Вариант 4 тоже сам использую, но в данном случае нужно обойтись без рекурсии.
Доберусь до дома и проверю все варианты. Возможно и в 1 варианте я где-то с синтаксисом намудрил.
return ({ int ReturnValue;
/*твой код здесь, сколько угодно, циклы, там, всякие, то-сё.
в переменную ReturnValue заносим значение, которое надо возвернуть
*/
; ReturnValue;});
О, идея пришла в голову.
Я не знаю, сработает или нет, но попробовать-то можно :).
Стирай constexpr, пиши вместо него ..attribute..((const)) (две точки это два подчеркивания, не зна., как тут два подчеркивания написать)
А если эта функция будет использоваться с константами в качестве аргумента, а не с переменной цикла, например, то вообще непонятно, зачем все это было городить? Компилятор при компиляции все сам вычислит безо всяких ухищрений.
Вы где и как эту функцию использовать собираетесь?