Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Правые угловые скобки






Давайте рассмотрим следующий код:

list< vector< string> > lvs;

 

С точки зрения С++98 приведенный код некорректен, поскольку между двумя закрывающими угловыми скобами (>) нет пробела. С++11 рассматривает подобную комбинацию угловых скобок как корректный терминатор списка из двух аргументов шаблона.

А почему это вообще было проблемой? Компилятор состоит из нескольких этапов анализа. Вот самая простая модель:

· Лексический анализ (создание лексем из символов).

· Синтаксический анализ (проверка грамматики).

· Проверка типов (поиск имен типов и выражений).

В теории, а иногда и на практике, эти этапы четко разделены, так что лексический анализатор, определяющий, что “> > ” является маркером (который обычно означает правый сдвиг или ввод), понятия не имеет о его значении; в частности, он не имеет ни малейшего понятия, ни о шаблонах, ни о вложенном списке аргументов шаблона. Однако чтобы сделать этот пример «корректным», эти три этапа должны как-то взаимодействовать. Ключевое наблюдение, которое привело к решению этой проблемы заключалось в том, что компиляторы С++ выдавали подходящее сообщение об ошибке, а значит уже умели выполнять весь необходимый анализ.

См. также:

· Раздел стандарта???

· [N1757==05-0017] Daveed Vandevoorde: revised right angle brackets proposal (revision 2).

 

Управление поведением по умолчанию: default и delete

Сейчас стандартная идиома «запрещения копирования» может быть явно выражена следующим образом:

class X {

//...

X& operator=(const X&) = delete; // Запрет копирования

X(const X&) = delete;

};

 

И наоборот, мы можем явно сказать о том, что хотим использовать поведение копирования по умолчанию:

class Y {

//...

Y& operator=(const Y&) = default; // Семантика копирования по умолчанию

Y(const Y&) = default;

}

};

 

Явная спецификация поведения по умолчанию является избыточной. Однако являются редкостью комментарии для операций копирования и (что еще хуже) явно определенные пользователем операции копирования, которые должны вести себя аналогично операциям по умолчанию. Реализация поведения по умолчанию этих операций компилятором обычно проще, менее подвержено ошибкам и часто приводит к лучшему объектному коду.

Ключевое слово “default” может использоваться с любой функцией для которой компилятор может реализовать поведение по умолчанию. Ключевое слово “delete” может быть использовано с любой функцией. Например, так вы можете запретить нежелательное преобразование типов:

struct Z {

//...

// может быть инициализирован с параметром типа long long


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.005 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал