Каков приоритет метаоператора?

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

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

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


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


person fredoverflow    schedule 12.08.2011    source источник
comment
в чем именно вопрос? это не оператор, с операторами не взаимодействует. возможно, вы должны привести пример.   -  person Gene Bushuyev    schedule 12.08.2011
comment
@Gene: я обновил вопрос.   -  person fredoverflow    schedule 12.08.2011
comment
@FredOverflow: некоторые вещи C++0x, которые вы спрашиваете, я знаю или могу интуитивно понять, другие (и этот) нет. Но, пожалуйста, продолжайте спрашивать. Я изучаю C++0x по вашим вопросам! Мол, ленивая птица, летит вслед за другой. :-)   -  person Cheers and hth. - Alf    schedule 12.08.2011
comment
@Alf: Пока все по очереди впереди пелетона, это лучший вид лени.   -  person Steve Jessop    schedule 12.08.2011
comment
@Steve: Если бы мы по очереди, то нам также пришлось бы циклически ответить, иначе на самом деле не было бы по очереди. (В конце концов, это сайт вопросов и ответов.) Однако, как и в случае с ответами, я хотел бы оставить задачу задавать вопросы тем, кто делает это лучше всего. И Фред доказал, что придумывает чертовски хорошие вопросы. Зачем нарушать это равновесие, если все мы выигрываем? :)   -  person sbi    schedule 13.08.2011
comment
@sbi: Ты имеешь в виду, что мои ответы отстой? ;)   -  person fredoverflow    schedule 13.08.2011


Ответы (2)


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

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

  • В списке инициализаторов (8.5); шаблон является предложением инициализатора.
  • В списке спецификаторов базы (10); шаблон является базовым спецификатором.
  • В списке инициализаторов памяти (12.6.2); шаблон является мем-инициализатором.
  • В списке аргументов-шаблонов (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
    }
    

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

person Alexandre C.    schedule 12.08.2011
comment
Это отличный ответ, который, к сожалению, не очень информативен. :-) - person Omnifarious; 12.08.2011
comment
Что могло бы сделать его более информативным, так это примеры каждого случая и конкретных случаев, показывающих, как расположение ... влияет на то, какой случай, по мнению компилятора, вы имеете в виду. - person Omnifarious; 14.08.2011
comment
@Omnifarious: стандартный текст разбросан по всему тексту по-разному. Соответствующие разделы содержат примеры. - person Alexandre C.; 16.08.2011

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

постфиксное выражение ( список-выраженийopt )

список-выражений — это просто список-инициалов, который выглядит так:

пункт-инициализатора ...opt
список-инициализаторов, пункт-инициализатора ...opt

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

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

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

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

foo(x ? args : 42...) and foo((x ? args : 42)...) 
person JohannesD    schedule 13.08.2011