Читать «Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14» онлайн - страница 224
Скотт Мейерс
8
В спецификациях интерфейса для операций перемещения в контейнерах стандартной библиотеки noexcept
отсутствует. Однако разработчикам разрешено усиливать спецификации интерфейсов функций стандартной библиотеки, и на практике как минимум для некоторых контейнеров операции перемещения объявляются как noexcept
. Эта практика является примером следования совету из данного раздела. Обнаружив, что можно написать операции перемещения так, что исключения гарантированно не будут генерироваться, разработчики часто объявляют такие операции как noexcept
, несмотря на то что стандарт языка от них этого не требует.
9
“Независимо от состояния программы” и “без ограничений” не узаконивает программы, поведение которых уже является неопределенным. Например, std::vector::size
имеет широкий контракт, но это не означает, что данная функция должна разумно себя вести при применении к произвольному блоку памяти, приведенному к типу std::vector
. Результат приведения не определен, поэтому нет никаких гарантий, касающихся поведения программы, содержащей такое приведение.
10
Поскольку Point::xValue
возвращает double
, типом mid.xValue() * 10
также является double
. Типы с плавающей точкой не могут использоваться для инстанцирования шаблонов или для указания значений перечислений, но они могут быть использованы как части больших выражений, дающих интегральные типы. Например, для инстанцирования шаблона или для указания значения перечислителя может использоваться выражение static_cast<int>(mid.xValue() * 10)
.
11
Из этого правила есть несколько исключений. Большинство из них обусловлено аварийным завершением программы. Если исключение выходит за пределы основной функции потока (например, main
в случае начального потока программы) или если нарушена спецификация noexcept
(см. раздел 3.8), локальные объекты могут не быть уничтожены; они, определенно, не уничтожаются, когда вызывается функция std::abort
или функция выхода (т.e. std::_Exit
, std::exit
или std::quick_exit
).
12
Стандарт не требует использования именно такой реализации, но все известные мне реализации стандартной библиотеки поступают именно так
13
Дня создания полнофункциональной версии make_unique
с минимальными усилиями поищите документ, ставший ее источником, и скопируйте из него ее реализацию. Этот документ — N3656 от 18 апреля 2013 года, его автор — Стивен T. Лававей (Stephan T. Lavavej).
14
На практике значение слабого счетчика не всегда совпадает с количеством указателей std::weak_ptr
, ссылающихся на управляющий блок, поскольку разработчики библиотеки нашли способы добавлять в слабый счетчик дополнительную информацию, которая упрощает генерацию лучшего кода. В данном разделе мы игнорируем этот факт и считаем, что значение слабого счетчика представляет собой количество указателей std::weak_ptr
, ссылающихся на управляющий блок.)).