code:
#include<iostream>
using namespace std;
int main()
{
size_t i = sizeof new int;
cout<<i;
}
Dans le compilateur GCC, fonctionne correctement sans avertissement ni erreur, et la sortie imprimée 8
.
Mais, dans le compilateur Clang, j'ai eu l'avertissement suivant:
warning: expression with side effects has no effect in an unevaluated context [-Wunevaluated-expression]
size_t i = sizeof new int;
sizeof new int;
comportement indéfini?L'avertissement n'indique pas que c'est UB; il indique simplement que le contexte d'utilisation, à savoir sizeof
, ne déclenchera pas les effets secondaires (qui dans le cas de new
alloue de la mémoire).
[expr.sizeof] L'opérateur sizeof donne le nombre d'octets occupés par un objet du type non-chevauchement potentiel. L'opérande est soit une expression, qui est un opérande non évalué ([expr.prop]), soit un type-id entre parenthèses.
La norme explique aussi utilement ce que cela signifie:
[expr.context] (...) Un opérande non évalué n'est pas évalué.
C'est bien, bien que ce soit une étrange façon d'écrire sizeof(int*)
.
new
l'opérateur renvoie le pointeur sur la mémoire allouée. new int
retournera un pointeur, donc sizeof new int;
retournera la taille d'un pointeur. C'est un code valide et il n'y a pas de comportement non défini ici.
Warning est légitime et ne met en garde que sur l'effet des effets secondaires sur l'opérande, car les opérandes de sizeof
ne sont pas évalués.
Par exemple:
int i = 1;
std::cout << i << '\n'; // Prints 1
size_t size = sizeof(i++); // i++ will not be evaluated
std::cout << i << '\n'; // Prints 1