3
Est-ce que la garantie C standard de l'appel queUne seule évaluation garantie pour std :: min/max std ::
c = std::min(f(x), g(x));
évalue les fonctions f et g une seule fois?
Est-ce que la garantie C standard de l'appel queUne seule évaluation garantie pour std :: min/max std ::
c = std::min(f(x), g(x));
évalue les fonctions f et g une seule fois?
Oui. Puisque std :: min est une fonction, f (x) et g (x) ne seront évalués qu'une seule fois. Et les valeurs retournées ne seront pas copiées. Voir le prototype de la fonction:
template<typename T>
const T& min (const T& a, const T& b);
Il y a une nette différence avec préprocesseur véritablement défini min macro:
#define MIN(A,B) ((A)<(B))?(A):(B)
hmm ... Est-il possible de retirer une version #define min ET assurez-vous qu'il appelle chaque fonction une fois? Juste curieux ... –
Par souci d'exhaustivité: vous ne pouvez cependant pas supposer l'ordre dans lequel les méthodes seront évaluées, c'est non spécifié. Par exemple, 'gcc' évalue généralement les arguments de droite à gauche. –
@Alexander Rafferty: Si c'était possible, cela aurait probablement déjà été fait dans les implémentations MIN existantes. La double évaluation des paramètres MIN a été une épine dans le côté des programmeurs pendant quelques décennies. – Constantin