Что означает знак"......"? т. е. оператор двойного многоточия на пакете параметров


просматривая текущую реализацию gcc новых заголовков C++11, я наткнулся на "......" знак. Вы можете проверить, что следующий код компилирует штрафа в размере [via ideone.com].

template <typename T>
struct X
{ /* ... */ };

template <typename T, typename ... U>
struct X<T(U......)> // this line is the important one
{ /* ... */ };

Итак, что же означает этот токен?

редактировать: похоже, подстриженный "......"в названии "...", Я действительно имел в виду"......". :)

2 107

2 ответа:

каждый экземпляр этой странности сопряжен со случаем регулярного одиночного многоточия.

  template<typename _Res, typename... _ArgTypes>
    struct _Weak_result_type_impl<_Res(_ArgTypes...)>
    { typedef _Res result_type; };

  template<typename _Res, typename... _ArgTypes>
    struct _Weak_result_type_impl<_Res(_ArgTypes......)>
    { typedef _Res result_type; };

  template<typename _Res, typename... _ArgTypes>
    struct _Weak_result_type_impl<_Res(_ArgTypes...) const>
    { typedef _Res result_type; };

  template<typename _Res, typename... _ArgTypes>
    struct _Weak_result_type_impl<_Res(_ArgTypes......) const>
    { typedef _Res result_type; };

Я предполагаю, что двойной эллипсис похож по смыслу на _ArgTypes..., ..., т. е. расширение вариационного шаблона с последующим списком varargs в стиле C.

вот тест поддерживая эту теорию... я думаю, что у нас есть новый победитель для худшего псевдо-оператора когда-либо.

Edit: это, кажется, верно. §8.3.5 / 3 описывает один из способов чтобы сформировать список параметров как

на vs2015 разделение запятой имеет важное значение в версии шаблона:

    template <typename T, typename ... U>
    struct X<T(U...,...)> {};// this line is the important one

пример создания экземпляра:

    X<int(int...)> my_va_func;

С уважением, ЧАСТОТНАЯ МОДУЛЯЦИЯ.