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

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

Предимството на операторите не е директно указано, но може да бъде извлечено от синтаксиса.

Някой готов ли е за предизвикателството? Разбира се, ... не се появява в таблиците с приоритет на операторите на 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); моделът е базов спецификатор.
  • В mem-initializer-list (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

Според удобната Hyperlinked C++ BNF Grammar извикването на функция изглежда така:

постфикс-израз (списък-списъкopt)

expression-list е просто initializer-list, което изглежда така:

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

където елипсите са обозначението за разширение на пакета.

initializer-clause от своя страна може да бъде или 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