Что такое правило « как если бы »?
Правило « как если бы » в основном определяет, какие преобразования разрешено выполнять реализации в законной программе на C ++. Короче говоря, все преобразования, которые не влияют на « наблюдаемое поведение » программы (точное определение см. Ниже), разрешены.
Цель состоит в том, чтобы дать реализациям свободу выполнять оптимизацию, пока поведение программы остается совместимым с семантикой, определенной стандартом C ++ в терминах абстрактной машины.
Где Стандарт вводит это правило?
Стандарт C ++ 11 вводит правило « как если бы » в параграфе 1.9 / 1:
Семантические описания в этом международном стандарте определяют параметризованную недетерминированную абстрактную машину. Этот международный стандарт не предъявляет требований к структуре соответствующих реализаций. В частности, им не нужно копировать или имитировать структуру абстрактной машины. Скорее, соответствующие реализации требуются для имитации (только) наблюдаемого поведения абстрактной машины, как объяснено ниже.
Также в пояснительной сноске добавлено:
Это положение иногда называют правилом «как если бы» , потому что реализация может игнорировать любое требование этого международного стандарта, если результат такой, как если бы требование было выполнено, насколько это можно определить по наблюдаемому поведению. программы. Например, фактическая реализация не должна оценивать часть выражения, если она может сделать вывод, что его значение не используется и что никаких побочных эффектов, влияющих на наблюдаемое поведение программы, не возникает.
Что именно предписывает правило?
Пункт 1.9 / 5 дополнительно уточняет:
Соответствующая реализация, выполняющая правильно сформированную программу, должна производить такое же наблюдаемое поведение, как одно из возможных выполнений соответствующего экземпляра абстрактной машины с той же программой и теми же входными данными . Однако, если любое такое выполнение содержит неопределенную операцию, настоящий международный стандарт не налагает никаких требований на реализацию, выполняющую эту программу с этим вводом (даже в отношении операций, предшествующих первой неопределенной операции).
Стоит подчеркнуть, что это ограничение применяется только при «выполнении хорошо сформированной программы» , и что возможные результаты выполнения программы, которая содержит неопределенное поведение, не ограничены. Это также ясно указано в параграфе 1.9 / 4:
Некоторые другие операции описаны в этом международном стандарте как неопределенные (например, эффект попытки изменить константный объект). [Примечание: этот международный стандарт не налагает требований к поведению программ, которые содержат неопределенное поведение . - конец примечания]
Наконец, что касается определения " наблюдаемого поведения ", пункт 1.9 / 8 гласит следующее:
Наименьшие требования к соответствующей реализации:
- Доступ к изменчивым объектам оценивается строго по правилам абстрактной машины.
- При завершении программы все данные, записанные в файлы, должны быть идентичны одному из возможных результатов, которые могло бы дать выполнение программы в соответствии с абстрактной семантикой.
- Динамика ввода и вывода интерактивных устройств должна происходить таким образом, чтобы вывод подсказок фактически доставлялся до того, как программа ожидает ввода. Что представляет собой интерактивное устройство, определяется реализацией.
Все вместе они называются наблюдаемым поведением программы . [ Примечание : в каждой реализации может быть определено более строгое соответствие между абстрактной и фактической семантикой. - конец примечания ]
Есть ли ситуации, когда это правило не применяется?
Насколько мне известно, единственным исключением из правила « как если бы » является исключение копирования / перемещения, которое разрешено, даже если конструктор копирования, конструктор перемещения или деструктор класса имеют побочные эффекты. Точные условия для этого указаны в Пунктах 12.8 / 31:
При соблюдении определенных критериев реализации разрешается опускать конструкцию копирования / перемещения объекта класса, даже если конструктор, выбранный для операции копирования / перемещения, и / или деструктор для объекта имеют побочные эффекты . [...]