static_cast reinterpret_cast c++ casting language-lawyer static-cast const-cast

c++ - reinterpret_cast - ¿Por qué está(int &) 0 mal formado?



reinterpret_cast c++ (1)

De acuerdo con [expr.cast] / 4, un reparto de estilo C prueba los siguientes repartos en orden:

  1. const_cast
  2. static_cast
  3. static_cast seguido de const_cast
  4. reinterpret_cast
  5. reinterpret_cast seguido de const_cast

El siguiente reparto está bien formado:

const_cast<int&>(static_cast<const int&>(0))

Sin embargo, tanto GCC como Clang reject el reparto (int&)0 . ¿Por qué?


La razón por la que se rechaza el cast (int &) 0 es porque está intentando emitir un literal como una referencia que realmente no tiene sentido. El operador & espera un valor de referencia y no puede hacer referencia a un literal. El compilador ve que está emitiendo un literal como rvalue, por lo tanto main.cpp:2:11: error: invalid cast of an rvalue expression of type ''int'' to type ''int&''

Esta pregunta no se reduce realmente a la jerarquía de los modelos, sino a la incapacidad de emitir literales como referencias.

Edición: Nota rápida, estoy un poco confundido por su redacción, es const_cast<int&>(static_cast<const int&>(0)); ¿Aceptado por el compilador? No debería ser debido a lanzar un lvalue como un rvalue. Si es así, debo haber entendido mal la pregunta y recusaré mi respuesta.