37 votes

Utilisation de `void()` dans une liste séparée par des virgules ?

Je regardais un morceau de code écrit par d'autres quand j'ai vu ça :

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

où les deux a y b sont des instances d'une classe de modèle définie par l'utilisateur, qui est destinée à agir comme une fonction en surchargeant operator() qui renvoie l'instance appelante elle-même.

Une partie de la classe :

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

Les déclarations de retour pour les deux surcharges sont les suivantes :

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;
}

Que fait le void() entre eux ? Je trouve ça étrange.

47voto

Simple Points 4460

Le site void() empêche une surcharge de operator, d'être appelé (où l'un des paramètres est du type SomeClass<T> ), car une telle surcharge ne peut pas avoir un paramètre de type void .

Vous le verrez le plus souvent utilisé dans les modèles, et il est utilisé dans les extensions de packs variadiques :

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

Lorsqu'un operator, pourrait ruiner le garanties de séquençage de la langue.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X