"удаление" копии ctor/assign в С++ 11

В VS 2010 SP1:

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

не компилируется. Он жалуется:

CPPConsole.cpp(365): ошибка C2059: синтаксическая ошибка: ';'
CPPConsole.cpp(365): ошибка C2238: неожиданный токен (ы), предшествующий ';'
CPPConsole.cpp(366): ошибка C2059: синтаксическая ошибка: ';'
CPPConsole.cpp(366): ошибка C2238: неожиданный токен (ы), предшествующий ';'

Разве это еще не поддерживается? Странно, Intellisense, похоже, признает эту конструкцию. В нем говорится, что "IntelliSense: function" Foo:: operator = (const Foo &) "(объявлено в строке 366) нельзя ссылаться - это удаленная функция"

Что мне не хватает?

Ответы

Ответ 1

VS 2010 имеет нечто двойственное. В частности, на самом деле у него есть два полностью отдельных конца компилятора.

Когда вы компилируете код, который выполняется с собственным компилятором Microsoft, который полностью возвращается к MS C 3.0 для MS-DOS, выпущен ~ 3 десятилетия назад (в случае, если вам интересно, почему это было 3.0, MS продала перемаркированная версия Lattice C до этого).

До VS 2008, синтаксический анализ в среде IDE был довольно примитивным по сравнению с компилятором, поэтому он не разбирал много более сложных С++ совершенно правильно. Они решили, что это неприемлемо, и вместо того, чтобы пытаться обновить существующий парсер IDE в соответствии с компилятором, они лицензировали интерфейс компилятора EDG.

Это дает более или менее противоположную ситуацию: синтаксический анализатор IDE для Intellisense теперь значительно ближе к согласованию, чем тот, что есть в компиляторе, и распознает справедливое количество конструкций С++ 0x, которые нет в компиляторе.

В этом рассказе немного больше, чем просто: front-end компилятора EDG поддерживает переключатель, чтобы заставить его действовать скорее как VС++, включая эмуляцию множества ошибок VС++. Хотя у меня нет данных, чтобы подтвердить это, я полагаю, что Microsoft использует эту возможность. Поскольку это основано на EDG с использованием компилятора VС++ и эмуляции его ошибок, вероятно, справедливое предположение, что (по крайней мере, обычно) эмуляция EDG VС++ будет работать с версией, находящейся за VС++. Это дает несколько парадоксальную ситуацию, когда EDG (при нормальном использовании), как правило, немного опережает VС++, но версия MS, используемая в среде IDE, вероятно, будет по крайней мере немного отставать большую часть времени.

Ответ 2

Он еще не реализован в VS2010.