Унарные операторы обычно анализируются с более высоким приоритетом, чем бинарные операторы, и при сканировании слева направо префиксный оператор будет найден первым. Так почему же порядок вычисления stringize (#
) операторы, не указанные в отношении конкатенации (##
) операторы? Означает ли порядок оценки нечто отличное от приоритета в контексте [cpp.stringize] §16.3.2?
(Препроцессор не имеет побочных эффектов, поэтому технически у него нет такого понятия, как порядок оценки.)
И как текст «заменяется токеном предварительной обработки однобуквенной строки», который содержит орфографию последовательности токенов предварительной обработки для соответствующего аргумента «jibe с другим приоритетом», учитывая, что любая альтернатива будет приводить к строковому результату конкатенации, а не аргументу per se ?
Делает ли какая-либо реализация что-то смешное, или можно было бы безопасно удалить порядок оценки текста и заменить на « #
оператор имеет более высокий приоритет, чем ##
оператор «?
Этот вопрос добавляется в список рассылки std-Discussion, но, пожалуйста, ответьте здесь.
Примечание: я планирую подготовить официальное предложение по пересмотру этой части спецификации C ++, поэтому, пожалуйста, поделитесь своими знаниями! Основная мотивация — сделать препроцессор более детерминированным.
Я надеюсь увидеть другой ответ, но после комментария @R я склоняюсь к мнению, что стандарт означает именно то, что он говорит. Из-за отсутствия побочных эффектов порядок оценки не влияет на препроцессор, поэтому не должен быть уточненным. Приоритетность и ассоциативность #
а также ##
должны быть указаны, но не включены в стандарт.
Каждый из условий ассоциативность, старшинство, а также порядок оценки имеет взаимоисключающее значение, и стандарт должен быть выше, опровергая их.
Редактировать: я официально предложил чтобы решить это. (См. Раздел 5.1.)
Других решений пока нет …