Неуказанный порядок вычисления операторов stringize

Унарные операторы обычно анализируются с более высоким приоритетом, чем бинарные операторы, и при сканировании слева направо префиксный оператор будет найден первым. Так почему же порядок вычисления stringize (#) операторы, не указанные в отношении конкатенации (##) операторы? Означает ли порядок оценки нечто отличное от приоритета в контексте [cpp.stringize] §16.3.2?

(Препроцессор не имеет побочных эффектов, поэтому технически у него нет такого понятия, как порядок оценки.)

И как текст «заменяется токеном предварительной обработки однобуквенной строки», который содержит орфографию последовательности токенов предварительной обработки для соответствующего аргумента «jibe с другим приоритетом», учитывая, что любая альтернатива будет приводить к строковому результату конкатенации, а не аргументу per se ?

Делает ли какая-либо реализация что-то смешное, или можно было бы безопасно удалить порядок оценки текста и заменить на « # оператор имеет более высокий приоритет, чем ## оператор «?

Этот вопрос добавляется в список рассылки std-Discussion, но, пожалуйста, ответьте здесь.

Примечание: я планирую подготовить официальное предложение по пересмотру этой части спецификации C ++, поэтому, пожалуйста, поделитесь своими знаниями! Основная мотивация — сделать препроцессор более детерминированным.

2

Решение

Я надеюсь увидеть другой ответ, но после комментария @R я склоняюсь к мнению, что стандарт означает именно то, что он говорит. Из-за отсутствия побочных эффектов порядок оценки не влияет на препроцессор, поэтому не должен быть уточненным. Приоритетность и ассоциативность # а также ## должны быть указаны, но не включены в стандарт.

Каждый из условий ассоциативность, старшинство, а также порядок оценки имеет взаимоисключающее значение, и стандарт должен быть выше, опровергая их.

Редактировать: я официально предложил чтобы решить это. (См. Раздел 5.1.)

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]