Para agregar const
a un objeto no const, ¿cuál es el método preferido? const_cast<T>
o static_cast<T>
. En una pregunta reciente, alguien mencionó que prefieren usar static_cast
, pero yo hubiera pensado que const_cast
dejaría más clara la intención del código. Entonces, ¿cuál es el argumento para usar static_cast
para hacer una constante const?const_cast vs static_cast
Respuesta
No utilizar ninguno de los dos. Inicializar una referencia const que se refiere al objeto:
T x;
const T& xref(x);
x.f(); // calls non-const overload
xref.f(); // calls const overload
O bien, utilizar una plantilla de implicit_cast
función, como the one provided in Boost:
T x;
x.f(); // calls non-const overload
implicit_cast<const T&>(x).f(); // calls const overload
Dada la posibilidad de elegir entre static_cast
y const_cast
, static_cast
es definitivamente preferible: const_cast
debe solo se debe usar para descartar constness porque es el único molde que puede hacerlo, y la eliminación de la constness es intrínsecamente peligrosa. La modificación de un objeto a través de un puntero o una referencia obtenida mediante la eliminación de la constness puede dar como resultado un comportamiento indefinido.
diría static_cast
es preferible, ya que sólo se permitirá lanzar a partir de la no const
const
(que es seguro), y no en la otra dirección (que no es necesariamente seguro).
Esto parece coincidir con la opinión de Scott Meyers; vea _Efectivo C++ _, artículo 3, en el ejemplo "Evitando duplicación ...". –
Este es un buen caso de uso para una plantilla de función implicit_cast.
Se puede escribir su propio reparto:
template<class T>
const T & MakeConst(const T & inValue)
{
return inValue;
}
- 1. static_cast vs dynamic_cast
- 2. const_cast VS mutable? ¿alguna diferencia?
- 3. C++ ¿diferencia entre agregar const-ness con static_cast y const_cast de "este" objeto?
- 4. static_cast safety
- 5. static_cast <int> (foo) vs. (int) foo
- 6. Comportamiento indefinido con const_cast
- 7. ¿Es const_cast seguro?
- 8. Sobrecarga de static_cast?
- 9. static_cast con boost :: shared_ptr?
- 10. Bizarre static_cast truco?
- 11. ¿Está mal usado static_cast?
- 12. Pregunta sobre const_cast en C++
- 13. ¿Es este comportamiento indefinido const_cast?
- 14. Usos correctos de const_cast <>
- 15. const_cast de un miembro de const estático
- 16. static_cast para tipos definidos por el usuario
- 17. Operador de conversión implementado con static_cast
- 18. ¿Qué pasa con static_cast con múltiples argumentos?
- 19. error Clang: conversión ambigua para static_cast
- 20. ¿Está bien para static_cast un puntero void *
- 21. Redondeo con static_cast <int>?
- 22. const_cast en la plantilla. ¿Hay algún modificador incondicional?
- 23. ¿Const_cast causa emisión de código real alguna vez?
- 24. ¿Es const_cast <const Type*> alguna vez útil?
- 25. ¿Cuál es la diferencia entre static_cast y Implicit_cast?
- 26. ¿Cuál es la diferencia entre static_cast y reinterpret_cast?
- 27. ¿Por qué no puedo static_cast entre char * y unsigned char *?
- 28. ¿Dónde está el comportamiento indefinido cuando se usa const_cast <>?
- 29. ¿Esta inicialización de const a través de const_cast tiene un comportamiento indefinido?
- 30. ¿Está permitido utilizar const_cast para el acceso de solo lectura a un objeto const?
mayoría de los yesos pueden ser "peligroso". – curiousguy
Scott Meyers da un ejemplo de usar un 'static_cast' para' const' seguido de un 'const_cast' para hacer que la versión non-'const' de' operator [] 'llame a la versión' const'. ¿Se puede lograr lo mismo usando una referencia constante? –
Parece que * puedes * reemplazar el 'static_cast' al crear una nueva referencia de const, pero por supuesto debes usar' const_cast' para devolver una referencia que no sea const. Sin embargo, no estoy seguro de si esto es un comportamiento específico del compilador o plataforma, o si está implícito en alguno de los requisitos del estándar. –