Що таке правило " як би "?
Правило " як би " в основному визначає, які перетворення реалізація дозволена виконувати в легальній програмі на C ++. Коротше кажучи, допускаються всі перетворення, які не впливають на " спостережувану поведінку " програми (точне визначення див. Нижче).
Мета полягає в тому, щоб надати реалізаціям свободу виконувати оптимізації, доки поведінка програми залишатиметься сумісною із семантикою, визначеною стандартом C ++, з точки зору абстрактної машини.
Де Стандарт вводить це правило?
Стандарт C ++ 11 вводить правило " як би " у пункті 1.9 / 1:
Семантичні описи в цьому міжнародному стандарті визначають параметризовану недетерміновану абстрактну машину. Цей міжнародний стандарт не встановлює вимог щодо структури відповідних реалізацій. Зокрема, їм не потрібно копіювати або наслідувати структуру абстрактної машини. Швидше, відповідні реалізації вимагають імітувати (лише) спостережувану поведінку абстрактної машини, як пояснено нижче.
Також пояснювальна виноска додає:
Це положення іноді називають правилом "ніби" , оскільки імплементація може нехтувати будь-якою вимогою цього Міжнародного стандарту, якщо результат є таким, ніби вимога була виконана, наскільки це можна визначити із спостережуваної поведінки програми. Наприклад, фактична реалізація не повинна оцінювати частину виразу, якщо вона може зробити висновок, що його значення не використовується, і що побічні ефекти, що впливають на спостережувану поведінку програми, не виробляються.
Що саме вимагає правило?
Пункт 1.9 / 5 додатково визначає:
Відповідна реалізація, що виконує добре сформовану програму, повинна виробляти таку ж спостережувану поведінку, як одне з можливих виконання відповідного екземпляра абстрактної машини з тією ж програмою та однаковим входом . Однак, якщо будь-яке таке виконання містить невизначену операцію, цей Міжнародний стандарт не встановлює вимог до реалізації, що виконує цю програму з цим входом (навіть щодо операцій, що передують першій невизначеній операції).
Варто наголосити, що це обмеження застосовується лише при "виконанні добре сформованої програми" , і що можливі результати виконання програми, яка містить невизначену поведінку, є необмеженими. Це також чітко зазначено в пункті 1.9 / 4:
Деякі інші операції описані в цьому міжнародному стандарті як невизначені (наприклад, ефект спроби модифікувати об'єкт const). [Примітка: Цей міжнародний стандарт не встановлює вимог щодо поведінки програм, що містять невизначену поведінку . —Кінець примітки]
Нарешті, щодо визначення поняття " спостережувана поведінка ", пункт 1.9 / 8 звучить так:
Найменшими вимогами до відповідного впровадження є:
- Доступ до летких об'єктів оцінюється строго за правилами абстрактної машини.
- При припиненні програми всі дані, записані у файли, повинні бути ідентичними одному з можливих результатів, який могло б дати виконання програми відповідно до абстрактної семантики.
- Динаміка введення та виведення інтерактивних пристроїв повинна відбуватися таким чином, щоб спонукальний вихід фактично доставлявся до того, як програма очікує на введення. Те, що становить інтерактивний пристрій, визначається реалізацією.
Вони в сукупності називаються спостережуваною поведінкою програми . [ Примітка : Більш суворе відповідність між абстрактною та фактичною семантикою може бути визначено кожною реалізацією. - кінцева примітка ]
Чи бувають ситуації, коли це правило не застосовується?
Наскільки мені відомо, єдиним винятком із правила " як би " є копіювання / переміщення, яке дозволено, навіть якщо конструктор копіювання, конструктор переміщення або деструктор класу мають побічні ефекти. Точні умови для цього вказані в параграфі 12.8 / 31:
Коли дотримуються певні критерії, реалізація може опускати конструкцію копіювання / переміщення об'єкта класу, навіть якщо конструктор, вибраний для операції копіювання / переміщення, та / або деструктор для об'єкта мають побічні ефекти . [...]