2017-09-13 7 views
3

En lisant les exemples de std :: hash utilisés pour std :: unordered_map, j'ai remarqué que la fonction operator() était accessible par {}.Pourquoi {} est-il utilisé pour accéder à operator() dans std :: hash?

http://en.cppreference.com/w/cpp/utility/hash

result_type operator()(argument_type const& s) const 
{ 
    result_type const h1 (std::hash<std::string>{}(s.first_name)); 
    result_type const h2 (std::hash<std::string>{}(s.last_name)); 
    return h1^(h2 << 1); // or use boost::hash_combine (see Discussion) 
} 

Qu'est-ce que l'utilisation de {} représenter ici?

+0

https://stackoverflow.com/questions/18222926/why-is-list-initialization-using-curly-braces-better-than-the-alternatives –

+1

Je souhaite C++ a permis 'opérateur statique () 's. –

+0

related/dupe: https://stackoverflow.com/questions/40024008/how-to-understand-two-pairs-of-parentheses-in-this-code-fragment – NathanOliver

Répondre

6

std::hash<T> est un type qui n'est pas une fonction.

Une instance de std::hash a un operator() qui effectue le hachage.

Donc std::hash<std::string> est un type de hachage. {} puis crée une instance de ce type. (s.first_name) appelle operator() sur un std::hash<std::string>.

std::hash<std::string>{}(s.first_name); 
^     ^ ^
|      | call operator() on that instance 
type of hasher  | 
       create an instance of that type 
+0

@erip allez-vous me donner un upvote si je fais la même chose? Je plaisante: P J'allais en fait dessiner quelque chose de similaire mais j'étais trop lent – user463035818

+1

@ tobi303 Je vais upvote si vous ajoutez des cercles rouges à main levée. – Yakk

+0

vous êtes assez exigeant, mais je ne suis pas non plus motivé pour faire autre chose: P – user463035818

2

std::hash est pas une fonction, mais une classe, plus précisément un foncteur. Vous devez donc créer un objet de cette classe avant de pouvoir appeler son operator().

enter image description here

+0

est-ce vraiment un coup de main? :> –

+0

Regarde à main levée. Malheureusement je n'ai pas dit "seulement si", donc j'avais déjà voté. ;) Mais +1 cercles rouges à main levée. – Yakk