c++ c++11 templates static-assert

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>