Какой приоритет у мета-оператора ...? - PullRequest
7 голосов
/ 12 августа 2011

Каков приоритет мета-оператора ..., чья работа заключается в распаковке пакетов параметров типа шаблона?Я предполагаю, что это довольно низко, но насколько это низко?Стандарт C ++ гласит:

Приоритет операторов не указан напрямую, но он может быть получен из синтаксиса.

Кто-нибудь готов ответить на вызов?Конечно, ... не появляется в таблицах приоритетов операторов C ++ 03.


Хорошо, если ... не является оператором, что точно определяет, что std::forward<Args>(args)... применяется ко всемупоследовательность std::forward<Args>(args), а не просто (args), например?

Ответы [ 2 ]

5 голосов
/ 12 августа 2011

Это не похоже на оператора. Начиная с N3092 (извините, у меня нет под рукой более свежего черновика)

[14.5.3] 4 / Расширение пакета - это последовательность токенов, которая называет один или больше пакетов параметров, за которыми следует многоточие. Последовательность токенов называется шаблоном расширения; его синтаксис зависит от контекст, в котором происходит расширение. Расширения пакета могут произойти в следующие контексты:

  • в списке инициализаторов (8.5); шаблон является инициализатор-пункт.
  • В списке базовых спецификаторов (10); шаблон является базовым спецификатором.
  • в списке mem-initializer-list (12.6.2); шаблон является MEM-инициализатор.
  • В списке аргументов шаблона (14.3); шаблон является шаблон аргументов.
  • В спецификации динамических исключений (15.4); шаблон является тип-идентификатор.
  • в списке атрибутов (7.6.1); шаблон является атрибутом.
  • в списке захвата (5.1.2); образец - захват. [Пример:

    template<class ... Types> void f(Types ... rest);
    template<class ... Types> void g(Types ... rest) {
        f(&rest ...); // “&rest ...” is a pack expansion; “&rest” is its pattern
    }
    

    - конец примера]

1 голос
/ 13 августа 2011

Согласно удобной Гиперссмотренной грамматике C ++ BNF , вызов функции выглядит следующим образом:

postfix-expression (expression-list opt )

выражение-список - это просто список инициализатора , который выглядит следующим образом:

initializer-clause ... opt
initializer-list, initializer-clause ... opt

где эллипсы - это обозначение расширения пакета.

предложение-инициализатор , в свою очередь, может быть выражением присваивания или braced-init-list.

Все это означает, что многоточие имеет более низкий грамматический приоритет, чем любой фактический оператор, поэтому, например, следующие значения эквивалентны:

foo(args ^= 0x1234...) and foo((args ^= 0x1234)...)

foo(x ? args : 42...) and foo((x ? args : 42)...) 
...