Quelqu'un peut-il expliquer (ce qui pourrait être mon perçu) la disparité des erreurs dans le code suivant? Essentiellement, pourquoi "//OK" et "// erreur" sont-ils corrects?C++ Expression constante et limites de tableau
(compilateur est i686-pomme-darwin9-g ++ - 4.0.1 (GCC) 4.0.1 (Apple Inc. construire 5490))
#include <cmath>
#include <iosfwd>
template <typename T>
class TT{
char _c[sizeof(T) + static_cast<size_t>(::ceil(sizeof(T) * 0.001)) + 1]; // error: array bound is not an integer constant
//char _c[sizeof(T) + static_cast<size_t>(sizeof(T) * 0.001) + 1]; // OK
T _t;
};
class IS{
unsigned char* _u;
double _d;
};
char s[static_cast<size_t>(::ceil(sizeof(TT<IS>) * 10.0))]; // error: array bound is not an integer constant
int main(int argc, char** argv){
char a[static_cast<size_t>(10.0)]; // OK
char b[static_cast<size_t>(::ceil(sizeof(double) * 10.0))]; // OK
TT<int> it;
char c[static_cast<size_t>(::ceil(sizeof(TT<int>) * 10.0))]; // OK
TT<IS> is;
char d[static_cast<size_t>(::ceil(sizeof(TT<IS>) * 10.0))]; // OK
return 0;
}
Comme une note de côté, je suis conscient de C + + 0x: expression constante généralisée.
C'est ce que je voulais vérifier. Dans une fonction ayant ceil() (ou toute autre fonction d'ailleurs) dans la déclaration de tableau ne rompt pas les sémantiques/règles du langage. Mais, dans une classe dont la taille d'un tableau dépend d'une fonction, cela casserait sizeof(). Dans ce cas, sizeof (TT) n'est pas disponible au moment de la compilation. Merci beaucoup! Appréciez votre temps! – kvs
Grande réponse sharptooth. BTW, avec le compilateur Visual C++ de Microsoft, vous ne pouvez pas faire cela au niveau de la fonction. – Aamir