2011-08-17 35 views
14

w VS 2010 SP1, co następuje:"usuwanie" kopia konstruktor/przypisania w C++ 11

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

nie kompiluje. Narzeka:

CPPConsole.cpp (365): błąd C2059: błąd składni: ';'
CPPConsole.cpp (365): błąd C2238: nieoczekiwany token (y) poprzedzający ";"
CPPConsole.cpp (366): błąd C2059: błąd składni: ';'
CPPConsole.cpp (366): błąd C2238: nieoczekiwany token (y) poprzedzający ";"

Czy to nie jest jeszcze obsługiwane? Dziwne jest to, że Intellisense wydaje się rozpoznawać tę konstrukcję. Mówi "IntelliSense: funkcja" Foo :: operator = (const Foo &) "(zadeklarowane w wierszu 366) nie można odwoływać się - jest to funkcja usunięta"

Czego mi brakuje?

Odpowiedz

33

VS 2010 ma coś z podwójnej osobowości. W szczególności ma dwa całkowicie oddzielne interfejsy kompilatora.

Podczas kompilacji kodu jest to robione przy pomocy własnego kompilatora Microsoftu, który powraca do MS C 3.0 dla MS-DOS, wydany ~ 3 dekady temu (w przypadku, gdy zastanawiacie się, dlaczego to było 3,0, MS sprzedał przedtem zmienioną wersję Kraty C).

Aż do VS 2008, parsowanie w IDE było dość prymitywne w porównaniu do kompilatora, więc nie parsowało całkiem sporo wyrafinowanego C++ całkiem poprawnie. Postanowili, że jest to niedopuszczalne, i zamiast próbować zaktualizować istniejący parser IDE, aby dopasować go do kompilatora, licencjonowali front-end kompilatora EDG.

Daje to mniej lub bardziej odwrotną sytuację: parser IDE dla Intellisense jest teraz znacznie bliższy zgodności z wersją kompilatora i rozpoznaje spora liczbę konstrukcji C++ 0x, których kompilator nie stosuje.

Jest jednak coś więcej niż tylko to: kompilator EDG obsługuje przełącznik, dzięki któremu działa bardziej jak VC++, w tym emuluje sporą liczbę błędów VC++. Chociaż nie mam danych, aby to potwierdzić, moim założeniem byłoby, że Microsoft używa tej możliwości. Ponieważ jest to oparte na EDG pobierającym kompilator VC++ i emulującym jego błędy, prawdopodobnie zgadujemy, że (przynajmniej zwykle) emulacja VG ++ EDG będzie działać na temat wersji za samym VC++. Daje to nieco paradoksalną sytuację, w której EDG (w normalnym użyciu) jest zwykle nieco przed VC++, ale wersja MS używana w IDE prawdopodobnie robi to co najmniej nieznacznie w większości przypadków.

+2

Dzięki! +1 za odpowiedź na pytanie z historyczną perspektywą. – ForeverLearning

+0

Nie jestem pewien, czy analizator składni intellisense jest bliższy standardowi niż dostarczony kompilator. Często obserwuję coś wręcz przeciwnego, gdy intellisense pokazuje "brak operandów dopasowujących operatora", podczas gdy ADL kompilatora znajduje to bez problemu. Wygląda na to, że zgodność nie była przyczyną innego analizatora składni dla intellisense, a raczej szybkości analizowania. –

+0

@Gene - kompilator jest znany z tego, że nie wykonuje poprawnie ADL i szablonów.Przedni koniec EDG jest znacznie bardziej niezawodny. –

-1

To nie jest jeszcze zaimplementowane w VS2010.

+0

W jaki sposób program intellisense wie, że został usunięty i dlatego nie można się do niego odwoływać? – ForeverLearning

+3

Dlaczego miałbym wskazywać na "dziwną" rzecz w moim pytaniu, gdybym się nie zdziwił? – ForeverLearning

+1

@DeadMG, nie bądź beznadziejny. _ "Czego mi brakuje?" _ Jest tak samo częścią pytania jak "Czy to nie jest jeszcze obsługiwane?". –