J'ai la fonction d'aide suivante :
template<typename T, std::size_t N>
constexpr std::size_t Length(const T(&)[N]) {
return N;
}
Qui renvoie la longueur d'un tableau statique. Dans le passé, cela a toujours fonctionné, mais lorsque je fais ceci :
struct Foo
{
unsigned int temp1[3];
void Bar()
{
constexpr std::size_t t = Length(temp1); // Error here
}
};
Je reçois une erreur lorsque j'utilise MSVS 2017 :
error C2131: expression did not evaluate to a constant note: failure was caused by a read of a variable outside its lifetime note: see usage of 'this'
J'espérais que quelqu'un pourrait m'éclairer sur ce que je fais mal.
0 votes
Sans rapport, mais tu pourrais aussi bien faire
Length
noexcept
Il n'y a aucun scénario raisonnable dans lequel une exception pourrait être levée.1 votes
Il semble que cela fonctionne bien sur gcc .
1 votes
Ça ressemble à un bug de MSVC pour moi. Cela devrait être une expression constante, je ne vois pas pourquoi cela ne le serait pas.
0 votes
@SergeyA Ça craint, je vais envoyer un rapport d'anomalie.
2 votes
@super : Non, cela ne fonctionne pas dans GCC : coliru.stacked-crooked.com/a/927ce1d01daf819e . GCC sans
-pedantic-errors
pourrait l'autoriser car il prend en charge VLA en C++. Avec-pedantic-errors
il échoue également dans GCC C++17.0 votes
Quelle version spécifique du compilateur MSVC 2017 utilisez-vous ? Ils ont publié des mises à jour fréquentes avec diverses améliorations de la conformité aux normes. De même, quelle version de la norme C++ utilisez-vous pour construire le code ?
0 votes
@super Changer le code en "constexpr std::size_t t = Length(temp1)" provoque une erreur
0 votes
@JesperJuhl La dernière mise à jour, avec C++17 activé
0 votes
@Jarann a mis le numéro exact de la version du compilateur dans la question. "Actuel" maintenant et dans 5 ans, elle sera probablement très différente (et la question devrait alors avoir encore un sens).
1 votes
@JesperJuhl Désolé, version 14.14.26428