Je voudrais utiliser l'idiome optionnel à l'intérieur de ma fonction constexpr pour clarifier facilement si la variable est définie ou non.
Ce que j'ai essayé avec std::experimental::optional:
constexpr bool call()
{
std::experimental::optional r;
r = true; // Erreur
// Erreur similaire avec :
// r = std::experimental::optional(true);
if (!r)
{
return false;
}
return *r;
}
Je reçois l'erreur : appel à une fonction non-constexpr - donc l'assignation n'est pas possible, car cette opération ne peut pas être constexpr ([Exemple](https://gcc.godbolt.org/#compilers:!((compiler:g510,options:'-std%3Dc%2B%2B14',source:'%23include+%3Cexperimental/optional%3E%0A%0Aconstexpr+bool+call()%0A%7B%0A++std::experimental::optional%3Cbool%3E+r%3B+%0A++r+%3D+true%3B%0A++%0A++if+(!!r)%0A++%7B%0A++++return+false%3B%0A++%7D%0A++return+*r%3B%0A%7D%0A%0Aconstexpr+bool+f+%3D+call()%3B')),filterAsm:(commentOnly:!t,directives:!t,labels:!t),version:3)).
Mais si j'implémente ma propre (très laide, juste pour l'exemple,filterAsm:(commentOnly:!t,directives:!t,labels:!t),version:3)) classe optionnelle, cela fonctionne, car je n'implémente pas l'opérateur d'assignation/constructeur explicitement.
template
struct optional
{
bool m_Set;
T m_Data;
constexpr optional() :
m_Set(false), m_Data{}
{
}
constexpr optional(T p_Data) :
m_Set(true), m_Data(p_Data)
{
}
explicit constexpr operator bool()
{
return m_Set;
}
constexpr T operator *()
{
return m_Data;
}
};
Comment pourrais-je utiliser std::..::optionnel dans le même contexte avec une assignation à l'intérieur de fonctions constexpr ?