Я прочитал определение std::is_constant_evaluated()
, но до сих пор не понимаю, почему (1) не работает с последней версией GCC: error: 'x' is not a constant expression
template<auto v>
struct s
{};
constexpr void f(int x)
{
if (std::is_constant_evaluated())
{
// constexpr int z=x; (1)
// s<x> a; (2)
}
}
int main(int argc, char* argv[])
{
f(4);
//f(argc);
return 0;
}
- По стандарту это должно работать?
- Или просто реализация GCC глючит?
- Как-то я могу добиться ожидаемого поведения? Что в основном:
С ответвлением на std::is_constant_evaluated()
- если это правда: код может использовать переменные как constexpr (например, (2))
- если ложно: код использует переменные как неконстансные
ОБНОВЛЕНИЕ
Могу ли я «перенести» информацию о контексте в функцию? В принципе решать в f()
был ли это вызов с constexpr
x или нет.
ОБНОВЛЕНИЕ Более сложный пример того, чего я хотел бы достичь: этот образец должен, если возможно, преобразовать параметр в строку во время компиляции.
template<auto v>
struct dummy_stringify
{
static constexpr auto str=v==4 ? "4" : "31"; // this is just an example; imagine here a much more complex logic
};
constexpr void f(int x)
{
if (std::is_constant_evaluated())
{
std::puts("A compile time calculation:");
//std::puts(dummy_stringify<x>::str);
} else
{
std::cout<<"A runtime calculation:"<<std::endl;
std::cout<<x<<std::endl;
}
}
int main(int argc, char* argv[])
{
f(4);
f(argc);
return 0;
}
f(wrap<4>);
, я смог бы перегрузить f() для этого типа переноса... Но я хотел бы унифицировать поведение в одной функции, если это возможно - person Balázs Árva   schedule 13.08.2019if constexpr
? - person rubenvb   schedule 13.08.2019if constexpr (std::is_constant_evaluated())
всегда верно. Думаю в принципе бессмысленно его использовать. Илиif constexpr ()
что? - person Balázs Árva   schedule 13.08.2019