Использование `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()
между ними? Я чувствую это странно.
Ответы
Ответ 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,
может испортить последовательность, гарантирующую язык.