Pourquoi utiliser des non-membre de début et de fin de fonctions en C++11?

Chaque conteneur standard a un begin et end méthode pour le retour des itérateurs pour ce conteneur. Cependant, C++11 a, apparemment, a introduit la gratuité des fonctions appelées std::begin et std::fin qui appellent le begin et end fonctions de membre. Donc, au lieu d'écrire

auto i = v.begin();
auto e = v.end();

vous voulez écrire

using std::begin;
using std::end;
auto i = begin(v);
auto e = end(v);

Dans son discours, L'Écriture Moderne Du C++, Herb Sutter dit que vous devriez toujours utiliser les fonctions libres de maintenant, quand vous voulez le début ou la fin d'itérateur pour un conteneur. Toutefois, il n'entre pas dans le détail de pourquoi vous voulez. En regardant le code, il vous permet d'économiser tous d'un seul caractère. Donc, tant que le conteneur standard de go, la gratuit des fonctions semblent être complètement inutile. Herb Sutter a indiqué qu'il y avait des avantages pour les non-conteneurs standard, mais encore une fois, il n'a pas entrer dans les détails.

Donc, la question est quoi exactement la fonction libre versions de std::begin et std::end faire au-delà de l'appel de leur membre correspondant de la fonction des versions, et pourquoi voudriez-vous utiliser?

  • C'est un de moins de caractère, à l'exception des points pour vos enfants: xkcd.com/297