«удаление» копии ctor / assignment в C ++ 11 - PullRequest
14 голосов
/ 17 августа 2011

В 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: функция« Foo :: operator = (const Foo &) »(объявленная в строке 366) не может быть указана - это удаленная функция»

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

Ответы [ 2 ]

33 голосов
/ 17 августа 2011

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

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

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

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

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

0 голосов
/ 17 августа 2011

В VS2010 пока не реализовано.

...