2011-08-17 9 views
14

En VS 2010 SP1, los siguientes:"borrar" copia ctor/asignación en C++ 11

class Foo 
{ 
public: 
    Foo() { } 
    Foo(Foo const&) = delete; // Line 365 
    Foo& operator=(Foo const&) = delete; // Line 366 
}; 

no compila. Se queja:

CPPConsole.cpp (365): error C2059: error de sintaxis: ';'
CPPConsole.cpp (365): error C2238: token inesperado (s) anterior a ';'
CPPConsole.cpp (366): error C2059: error de sintaxis: ';'
CPPConsole.cpp (366): error C2238: token inesperado (s) anterior a ';'

¿Esto no es compatible todavía? Lo extraño es que Intellisense parece reconocer esta construcción. Dice "IntelliSense: función" Foo :: operator = (const Foo &) "(declarado en la línea 366) no se puede hacer referencia - es una función eliminada"

¿Qué me falta?

Respuesta

33

VS 2010 tiene algo de una doble personalidad. Específicamente, en realidad tiene dos frontales de compilador completamente separados.

Cuando compila el código, eso se hace con el propio compilador de Microsoft, que se remonta a MS C 3.0 para MS-DOS, publicado hace ~ 3 décadas (en caso de que se pregunte por qué era 3.0, MS vendió una versión etiquetada de Lattice C antes de eso).

Hasta VS 2008, el análisis en el IDE era bastante primitivo en comparación con el del compilador, por lo que no analizó mucho C++ más sofisticado con bastante corrección. Decidieron que era inaceptable, y en lugar de intentar actualizar el analizador existente del IDE para que coincidiera con el del compilador, licenciaron el front-end del compilador EDG.

Esto da más o menos la situación opuesta: el analizador del IDE para Intellisense ahora está considerablemente más cerca de conformarse que el del compilador, y reconoce un número justo de construcciones C++ 0x que el compilador no.

Sin embargo, hay algo más en la historia que eso: el front-end del compilador EDG admite un conmutador para que actúe más como VC++, e incluso emula una gran cantidad de errores de VC++. Aunque no tengo datos para confirmarlo, mi suposición sería que Microsoft usa esa capacidad. Como se basa en que EDG toma el compilador de VC++ y emula sus errores, es probable que adivine que (al menos en general) la emulación VC++ de EDG se ejecutará sobre una versión detrás de VC++. Eso nos da la situación algo paradójica de que EDG (en uso normal) normalmente está un poco por delante de VC++, pero la versión que usa MS en el IDE probablemente esté por lo menos un poco atrás la mayor parte del tiempo.

+2

Gracias! +1 para responder la pregunta con una perspectiva histórica también. – ForeverLearning

+0

No estoy seguro del analizador intellisense mucho más cercano al estándar que el compilador suministrado. Con frecuencia observo todo lo contrario cuando intellisense muestra "sin operador que hace coincidir los operandos" mientras que la ADL del compilador lo encuentra sin problemas. No parece que la conformidad fuera el motivo de un analizador diferente para intellisense, sino más bien la velocidad de análisis. –

+0

@Gene - El compilador es conocido por no hacer ADL y plantillas correctamente.La interfaz EDG es mucho más confiable. –

-1

Aún no está implementado en VS2010.

+0

Entonces, ¿cómo sabe intellisense que se ha eliminado y, por lo tanto, no se puede hacer referencia a él? – ForeverLearning

+3

¿Por qué señalaría algo "extraño" en mi pregunta si no me dejara perplejo? – ForeverLearning

+1

@DeadMG, no seas grosero. _ "¿Qué me estoy perdiendo?" _ Es una parte tan importante de la pregunta como "¿Todavía no es compatible?" _. –