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

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


person ForeverLearning    schedule 17.08.2011    source источник


Ответы (2)


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, вероятно, большую часть времени, по крайней мере, немного отстает.

person Jerry Coffin    schedule 17.08.2011
comment
Спасибо! +1 за ответ на вопрос и с исторической точки зрения. - person ForeverLearning; 17.08.2011
comment
Я не уверен, что синтаксический анализатор intellisense намного ближе к стандарту, чем прилагаемый компилятор. Я часто наблюдаю прямо противоположное, когда intellisense не показывает операторов, соответствующих операндам, в то время как ADL компилятора находит его без проблем. Не похоже, что соответствие было причиной другого парсера для intellisense, а скорее скорость парсинга. - person Gene Bushuyev; 18.08.2011
comment
@Gene - компилятор известен тем, что неправильно выполняет ADL и шаблоны. Передняя часть EDG намного надежнее. - person Bo Persson; 18.08.2011
comment
@ Бо Перссон - я знаю, это то, что часто говорят, но в этом случае VC был определенно прав, а intellisense определенно ошибался. - person Gene Bushuyev; 18.08.2011

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

person Puppy    schedule 17.08.2011
comment
Тогда как intellisense узнает, что он удален и, следовательно, на него нельзя ссылаться? - person ForeverLearning; 17.08.2011
comment
Зачем мне указывать странную вещь в моем вопросе, если она меня не озадачивает? - person ForeverLearning; 17.08.2011