Lamentablemente, las versiones anteriores de MSVC permitían el acceso a cualquier miembro estático mediante el nombre de clase y el punto.
#include <iostream>
struct A
{
static int a;
};
int A::a;
int main()
{
std::cout << A.a;
}
Este código está felizmente aceptada por MSVC9.0 con una advertencia
Advertencia 1 C4832 advertencia: token ''. es ilegal después UDT 'A'
El estándar C++, obviamente, no permite el acceso a un miembro estático a través de className.memberName
(aunque es perfectamente legal para acceder a un miembro estático a través de un objeto object.staticMemberName
).
Mi sentido común me dice que si MSVC sabe que esto no es estándar y le da una advertencia, entonces podemos desactivar esa extensión. Vamos a Project Propertied -> C/C++ -> Language
y establecemos Disable Language Extensions
al Yes
. ¿Crees que algo cambia? Por supuesto que no, el compilador aún acepta el código ilegal con la misma advertencia. A veces me pregunto qué hace realmente Disable Language Extensions
...
"Por ejemplo, le permite vincular libremente un temporal a una referencia a no const". Esto es correcto, siempre que con "libremente" se refiera a "el compilador emite una advertencia para usar una extensión no estándar". –