Aquí está el ejemplo de la expresión de "cerradura de ámbito" con error común: no se crea una variable local, por lo que el bloqueo no está en vigor. Este código se compila sin problemas tanto con VC++ 2010 y Comeau C++ en línea:Corrección de const con instancias temporales
Si constructor por defecto para ScopedLock está comentado, entonces ambos compiladores dará un error:
error C2512: 'ScopedLock' : no appropriate default constructor available
(Cuando ScopedLock
se utiliza correctamente, es decir, se crea una variable local: ScopedLock guard(m_mutex);
, a continuación, compilación falla como se esperaba Declarar m_mutex
correcciones como mutables el problema)
tengo dos preguntas:..
¿Por qué
X::foo
compila? Parece que el compilador pudo convertirconst Mutex&
enMutex&
de alguna manera.¿Qué rol juega
ScopedLock
constructor por defecto, por lo que la compilación tiene éxito?
Thanks.
Actualización: Encontré la respuesta. Parece que la instrucción ScopedLock(m_mutex);
crea una variable local m_mutex
del tipo ScopedLock
. No es temporal Es por eso que se requiere el constructor predeterminado ScopedLock::ScopedLock
.
gracias por la respuesta y la cita relevante de la Norma. –