c++ - ¿Cómo usar std:: is_volatile?
c++11 templates (3)
Estoy tratando de rechazar una operación específica en tipos volátiles. Para lograr esto, estoy tratando de usar std::is_volatile
, pero el código a continuación está compilando sin errores, que no es lo que quiero.
¿Por qué is_volatile::value
false en el siguiente caso?
#include <type_traits>
template<typename T>
inline void DoStuff(T val) {
static_assert(!std::is_volatile<T>::value, "No volatile types plz");
//...
}
int main() {
volatile char sometext[261];
DoStuff(sometext);
}
Cuando se intenta pasar la matriz por valor, se desintegra en un puntero a su primer elemento.
Esto significa que val
es en realidad un int volatile *
. Como tal, apunta a un int
volátil, pero no es en sí mismo volátil. Por lo tanto, std::is_volatile
devuelve falso.
Puede intentar tomar la matriz por referencia, o usar std::remove_pointer
.
Debido a que las funciones aceptan su argumento por valor, la calificación cv del argumento original se pierde.
Acéptalo por referencia:
void DoStuff(T& val)
El problema es que T no es un tipo volatile
en absoluto. Es de volatile char*
. Espera un minuto, dices, veo volatile
allí mismo. Es cierto, pero considera esto: char* volatile
es un tipo volátil. volatile char*
no lo es. Es un puntero no volátil a una matriz de caracteres volátiles.
Solución: std::is_volatile<typename std::remove_pointer<T>::type>