Стандарты С++ (завершение новых строк исходных файлов)

Я имею в виду: Почему текстовые файлы заканчиваются новой строкой? Один из ответов цитирует стандарт C89. Который вкратце диктует, что файл должен заканчиваться новой строкой, которой не сразу предшествует обратная косая черта.

Это относится к последнему стандарту С++?

#include <iostream>
using namespace std;

int main()
{
  cout << "Hello World!" << endl;
  return 0;
}
//\

Является ли это выше допустимым? (Предполагая, что после // \ есть новая строка, которую я не смог отобразить)

Ответ 1

Данный код является законным в случае С++, но не для C.

Действительно, стандарт C (N1570) гласит:

Каждый экземпляр символа обратной косой черты (\), за которым следует новая строка символ удаляется, сплайсируя физические исходные строки для формирования логических строк источника. Только последняя обратная косая черта на любой физической исходной линии должна иметь право быть частью такого сращивания. Исходный файл, который не является пустым, должен заканчиваться символом новой строки, которому непосредственно не должен предшествовать символ обратной косой черты перед любым таким сплайсинг имеет место.

Стандарт С++ (N3797) формулирует это немного по-другому (акцент мой):

Каждый экземпляр символа обратной косой черты (\), за которым сразу следует символ новой строки, удаляется, сплайсирование физических исходных строк для формирования логических строк источника. Только последняя обратная косая черта на любом физическом исходная линия должна иметь право быть частью такого сращивания. Если, в результате, последовательность символов, которая соответствует синтаксису имени универсального символа, поведение undefined. Исходный файл который не является пустым и не заканчивается символом новой строки или заканчивается символом новой строки немедленно предшествующий символу обратной косой черты перед выполнением любого такого сращивания, обрабатывается как будто к файлу добавлен дополнительный символ новой строки.