Tous les constructeurs de std :: span sont déclarés constexpr, mais je n'arrive pas à faire fonctionner l'un d'eux dans un contexte constexpr. La suppression de la mise en commentaire de l'un des constexpr ci-dessous entraînera une erreur de compilation.
#include <array>
#include <span>
int main()
{
constexpr int carray[3] = { 0, 1, 2 };
constexpr std::array<int, 3> array{ 0, 1, 2 };
using S = std::span<const int, 3>;
/*constexpr*/ S span1{ array.data(), 3 };
/*constexpr*/ S span2{array.begin(), array.end()};
/*constexpr*/ S span3{carray};
/*constexpr*/ S span4{array};
}
Est-il en fait possible de créer un type span constexpr, car il semble que les constructeurs ne puissent jamais être évalués au moment de la compilation lorsqu'ils doivent initialiser un pointeur ou une référence?
Réponses:
Vous ne pouvez pas utiliser de variables locales de fonction non statique dans une expression constante comme celle-ci. Vous avez besoin de la stabilité des adresses, ce qui n'est possible qu'avec des objets statiques. Modifier le code en
ou
Vous permet de créer un fichier
constexpr
std::span
.la source
constexpr
fonction (sans explicitestatic
). Ces objets ont-ils une durée de stockage statique par défaut ou est-ce différent?