c++ - compile - llvm 3.7 0
¿Es “sizeof new int;” comportamiento indefinido? (2)
La advertencia no indica que sea UB; simplemente dice que el contexto de uso, es decir, sizeof
, no activará los efectos secundarios (que en caso de ser new
es asignar memoria).
[expr.sizeof] El operador sizeof produce el número de bytes ocupados por un objeto no potencialmente superpuesto del tipo de su operando. El operando es una expresión, que es un operando sin evaluar ([expr.prop]), o una identificación de tipo entre paréntesis.
El estándar también explica de manera útil lo que eso significa:
[expr.context] (...) Un operando sin evaluar no se evalúa.
Es una multa, aunque una forma extraña de escribir sizeof(int*)
.
código:
#include<iostream>
using namespace std;
int main()
{
size_t i = sizeof new int;
cout<<i;
}
En el compilador GCC, funciona bien sin ninguna advertencia o error y se imprime la salida 8
.
Pero, en el compilador de Clang, recibí la siguiente advertencia:
warning: expression with side effects has no effect in an unevaluated context [-Wunevaluated-expression]
size_t i = sizeof new int;
- ¿Cual es verdadero?
- Es
sizeof new int;
comportamiento indefinido?
new
operador devuelve el puntero a la memoria asignada. new int
devolverá un puntero, por lo tanto sizeof new int;
devolverá el tamaño de un puntero. Este es un código válido y no hay ningún comportamiento indefinido aquí.
La advertencia es legítima y solo advierte sobre el efecto de los efectos secundarios en el operando y eso se debe a que los operandos de sizeof
no se evalúan.
Por ejemplo:
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