Je me demande pourquoi les foncteurs sont passés par copie aux fonctions des algorithm
:
template struct summatory
{
summatory() : result(T()) {}
void operator()(const T& value)
{ result += value; std::cout << value << "; ";};
T result;
};
std::array a {{ 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 }};
summatory sum;
std::cout << "\nLa somme de : ";
std::for_each(a.begin(), a.end(), sum);
std::cout << "est : " << sum.result;
Je m'attendais à la sortie suivante:
La somme de : 1; 1; 2; 3; 5; 8; 13; 21; 34; 55; est : 143
Mais sum.result
contient 0
, qui est la valeur par défaut assignée dans le constructeur. La seule façon d'obtenir le comportement souhaité est de capturer la valeur de retour du for_each
:
sum = std::for_each(a.begin(), a.end(), sum);
std::cout << "est : " << sum.result;
Cela se produit car le foncteur est passé par copie au for_each
au lieu de par référence:
template< class InputIt, class UnaryFunction >
UnaryFunction for_each( InputIt first, InputIt last, UnaryFunction f );
Le foncteur externe reste donc inchangé, tandis que celui interne (qui est une copie du foncteur externe) est mis à jour et est retourné après l'exécution de l'algorithme (démonstration en direct), donc le résultat est copié (ou déplacé) encore après avoir effectué toutes les opérations.
Il doit y avoir une bonne raison de faire le travail de cette manière, mais je ne comprends pas vraiment la logique de cette conception, donc mes questions sont les suivantes:
- Pourquoi les prédicats des algorithmes d'opérations de séquence sont-ils passés par copie au lieu de par référence?
- Quels avantages offre l'approche par copie par rapport à l'approche par référence?