Обновлено, см. ниже!
Я слышал и читал, что С++ 0x позволяет компилятору печатать "Hello" для следующего фрагмента
#include <iostream>
int main() {
while(1)
;
std::cout << "Hello" << std::endl;
}
Похоже, что это связано с потоками и возможностями оптимизации. Мне кажется, что это может удивить многих людей.
Есть ли у кого-то хорошее объяснение, почему это необходимо для разрешения? Для справки, последний проект С++ 0x говорит в 6.5/5
Цикл, который за пределами инструкции for-init в случае оператора for,
- не вызывает вызовы функций библиотечного ввода-вывода и
- не имеет доступа или изменения изменчивых объектов, а
- не выполняет никаких операций синхронизации (1.10) или атомных операций (статья 29)
можно предположить, что реализация завершается. [Примечание. Это предназначено для того, таких как удаление пустых петель, даже если завершение не может быть доказано. - конечная нота]
Edit:
В этой проницательной статье говорится об этом тексте стандартов
К сожалению, слова "undefined поведение" не используются. Однако в любой момент, когда стандарт говорит, что "компилятор может принять P", подразумевается, что программа, которая имеет свойство not-P, имеет семантику undefined.
Правильно ли, и компилятор разрешил печатать "Bye" для вышеуказанной программы?
Здесь есть еще более проницательная , которая связана с аналогичным изменением на C, начатое Guy, сделанным выше связанной статьей, Среди других полезных фактов они представляют решение, которое, как представляется, также относится к С++ 0x (обновление: это больше не будет работать с n3225 - см. Ниже!)
endless:
goto endless;
Компилятор не может оптимизировать это, кажется, потому что это не цикл, а прыжок. Другой парень суммирует предлагаемое изменение в С++ 0x и C201X
Записывая цикл, программист утверждает, что loop делает что-то с видимым поведением (выполняет ввод-вывод, обращается летучих объектов или выполняет синхронизацию или атомные операции), или что он в конечном итоге заканчивается. Если я нарушу это предположение написав бесконечный цикл без побочных эффектов, я лгу компилятор, а поведение моей программы - undefined. (Если мне повезет, компилятор может предупредить меня об этом.) Язык не предоставляет (больше не предоставляет?) способ выразить бесконечный цикл без видимое поведение.
Обновление от 3.1.2011 с n3225: комитет переместил текст в 1.10/24 и сказал
Реализация может предполагать, что любой поток в конечном итоге сделает одно из следующего:
- кончить,
- сделать вызов функции ввода-вывода библиотеки,
- доступ или изменение изменчивого объекта или
- выполнить операцию синхронизации или атомную операцию.
Тройка goto
будет не работать больше!