J'ai lu le std::is_constant_evaluated()
mais je ne sais toujours pas pourquoi (1) ne fonctionne pas avec la définition de la dernier CCG : 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;
}
- Selon la norme, cela devrait-il fonctionner ?
- Ou simplement l'implémentation de GCC est boguée ?
- Comment puis-je obtenir le comportement attendu ? Ce qui est en gros :
Avec un branchement sur std::is_constant_evaluated()
- si c'est vrai : le code peut utiliser les variables comme constexpr (comme (2))
- si c'est faux : le code utilise les variables comme des non-constexpr.
UPDATE
Puis-je "transporter" l'information sur la constexprésence dans une fonction ? Il s'agit essentiellement de décider dans f()
qu'il a été appelé avec constexpr
x ou non.
UPDATE Un exemple plus complexe de ce que j'aimerais réaliser : cet échantillon devrait, si possible, stringifier le paramètre au moment de la compilation.
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;
}