Нет, в вашем примере триграф не возвращается.
[lex.phases]p1
определяет три фазы перевода, относящиеся к вашему вопросу:
1. Последовательности триграфа заменяются соответствующими односимвольными внутренними представлениями.
3. Исходный файл разлагается на токены предварительной обработки.
4. Макро вызовы расширены.
Фаза 1 определяется [lex.trigraph]p1
. На этом этапе ваш код переводится на const char *trigraph = RAW("(#)")
.
Фаза 3 определяется [lex.pptoken]
. На этой стадии триграфы возвращаются в виде необработанных строковых литералов. Пункт 3 гласит:
Если следующий символ начинает последовательность символов, которые могут быть префиксом и начальной двойной кавычкой необработанного строкового литерала, такого как R ", следующий токен предварительной обработки должен быть необработанным строковым литералом. Между начальной и окончательной двойной кавычкой символы необработанной строки, любые преобразования, выполняемые на этапах 1 и 2 (триграфы, имена универсальных символов и объединение строк), возвращаются.
Это не так в вашем примере, поэтому триграф не возвращается. Ваш код преобразуется в токен предварительной обработки последовательность const
char
*
trigraph
=
RAW
(
"(#)"
)
Наконец, на этапе 4 макрос RAW
раскрывается, и происходит вставка токена, в результате чего получается следующая последовательность preprocessing-tokens : const
char
*
trigraph
=
R"(#)"
. r-char-sequence строкового литерала содержит #
. Этап 3 уже наступил, и нет другой точки, в которой происходит возврат триграфов.