compile c++ c++11 g++ sizeof clang++

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