Es" sizeof new int; " comportamiento indefinido?
Código:
#include<iostream>
using namespace std;
int main()
{
size_t i = sizeof new int;
cout<<i;
}
En el compilador GCC, funcionando bien sin ningún tipo de advertencia o error y salida impresa 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;
- ¿Cuál es verdadero?
- Es
sizeof new int;
comportamiento indefinido?
2 answers
La advertencia no indica que es UB; simplemente dice que el contexto de uso, es decir, sizeof
, no activará los efectos secundarios (que en el caso de new
está asignando memoria).
[expr.tamaño de] 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 no evaluado ([expr.prop]), o un id de tipo entre paréntesis.
El estándar también amablemente explica lo que eso significa:
[expr.context] (...) No se evalúa un operando no evaluado.
Es una multa, aunque una forma extraña de escribir sizeof(int*)
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-03 10:03:57
new
operator 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 comportamiento indefinido aquí.
La advertencia es legítima y solo advierte sobre el efecto del efecto secundario en el operando y eso es porque 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-03 15:16:07