2011-05-30 9 views
5

¿Fue std::string.npos válido alguna vez? (A diferencia del correcto std::string::npos.)std :: string.npos validez

Lo estoy viendo mucho en un viejo proyecto en el que estoy trabajando, y no se compila con VS2010.

¿Es algo de los días preestandarizados?

Respuesta

3

No, std::string.npos nunca fue válido, y no, no es algo de los días predeterminados.

Veo otras respuestas que mencionan que MSVC ha permitido esa notación.

Sin embargo, MSVC no es un compilador muy compatible. Por ejemplo, le permite vincular libremente un temporal a una referencia a no const. Para otro ejemplo, para las aplicaciones del subsistema GUI de Windows, debe utilizar conmutadores no bien documentados para que acepte un estándar main. Mucho mejoró desde que Microsoft contrató a Herb Sutter (y otro tipo que no recuerdo el nombre de ahora) para arreglar su monstruoso compilador. Y en términos relativos, ha sido realmente genial, pero en términos absolutos, bueno, ese compilador aún está un poco ausente.

+0

"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". –

3

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 ...

+0

A partir de VS2005 '/ Ze' está en desuso y es el valor predeterminado por lo que oficialmente todo lo que hace es cambiar el texto que se muestra en las propiedades del proyecto ya que las extensiones están siempre activadas. – AJG85

5

Érase una vez, cuando se desarrolló C con las clases, la sintaxis :: aún no se había inventado. El código parecía:

class X { 
public: 
    void f(); 
}; 

void X.f() // a dot! see D&E 2.3 
{ 
} 

Sin embargo, std espacio de nombres no existiera esos días. Por lo tanto, sospecho que std::string.npos es puramente la extensión de Microsoft (¿o un error?). Puede estar inspirado en la sintaxis anterior, y podría no serlo.

+0

¿No fue esto unos treinta años antes que VS2008? –

+0

@Tomalak: sí, lo fue. Por lo tanto, dudo que tenga alguna conexión con la 'característica'. Preguntaste sobre 'C++ pre-estándar', así que publiqué la información que conozco. – ybungalobill

+0

@Tomalak: en un segundo pensamiento, es posible. VS2005 acepta variables de miembros estáticos a través de '.' también. La primera implementación de C++ de microsoft se remonta a principios de los noventa. Es factible que esta característica permanezca intacta hasta VS2010. – ybungalobill

Cuestiones relacionadas