Подтвердить что ты не робот

Использование `void()` в списке, разделенном запятыми?

Я смотрел на кусок кода, написанный другими, когда увидел это:

a(), void(), b();

где оба a и b являются экземплярами пользовательского класса шаблонов, который предназначен для работы как функция путем перегрузки operator(), которая возвращает сам вызывающий экземпляр.

Часть класса:

template <typename T>
class SomeClass{
    public:
    SomeClass& operator()(void);
    const SomeClass& operator()(void) const;
}

Операторы return для обеих перегрузок следующие:

template <typename T>
SomeClass<T>& SomeClass<T>::operator()(void){
    // do stuff
    return *this;
}

template <typename T>
const SomeClass<T>& SomeClass<T>::operator()(void) const{
    // do stuff
    return *this;
}

Что делает void() между ними? Я чувствую это странно.

4b9b3361

Ответ 1

void() предотвращает вызов перегруженного operator, (где один из параметров имеет тип SomeClass<T>), так как такая перегрузка не может иметь параметр типа void.

Вы чаще всего увидите, что это используется в шаблонах, и используется в расширениях вариационного пакета:

// C++11/14:
int unpack[] = {0, (do_something(pack), void(), 0)...};
// C++17 (fold expression):
(void(do_something(pack)), ...);

Если перегруженный operator, может испортить последовательность, гарантирующую язык.