Для чего нужно использовать эллипсис в списке атрибутов в C++?

В ссылке C++ я нашел информацию о допустимом синтаксисе атрибутов в C++, это:

[[attribute-list]]
[[ using attribute-namespace : attribute-list ]]

"где list-list - это разделенная запятыми последовательность с нулевым или большим количеством атрибутов (возможно, заканчивающаяся на многоточие... с указанием расширения пакета)"

Я пытался использовать его, но я не вижу разницы между:

[[deprecated]] void f() 
{
}

а также

[[deprecated...]] void f() 
{
}

В обоих случаях вывод одинаковый.

Ответ 1

Это было добавлено в спецификацию для согласованности, а также потому, что будущее атрибутов все еще обсуждается. Учитывая, что в настоящее время у нас есть расширение пакета в вариативных шаблонах (см. Расширение пакета шаблонов Variadic), например:

// pack expansion in function arguments
template <typename... Args>
void f(Args... args) {}

// pack expansion in inheritance
template <typename... Inherited>
struct MyClass : Inherited... {};

В то же время имеет смысл подумать о расширении пакета для атрибутов. Несколько сценариев могут быть:

template <typename... Ts>
class [[Ts...]] MyClass {};

или же

template <typename... Ts>
class [[Ts()...]] MyClass {};

Но, опять же, это только в спецификации, и в настоящее время нет атрибута, который можно использовать как это.