2017-09-08 3 views
2

Considérez ce code, qui compile avec succès:Boost intrusives fonction membre statique unordered_set retourne le type de mauvaise taille

#include <boost/intrusive/unordered_set.hpp> 

using namespace boost::intrusive; 

typedef unordered_set_member_hook<> Hook; 

struct Item 
{ 
    Hook hook; 
}; 

typedef unordered_set<Item, 
    member_hook<Item, Hook, &Item::hook>, 
    size_type<uint32_t> > Map; 

static_assert(4 == sizeof(typename Map::size_type)); 
static_assert(8 == sizeof(decltype(Map::suggested_upper_bucket_count(1000)))); 

Dans les deux the documentation et the code, suggested_upper_bucket_count() est déclarée ainsi:

static size_type suggested_upper_bucket_count(size_type); 

Alors, comment peut ce soit que Map::size_type est 4 octets (uint32_t) mais le résultat de suggested_upper_bucket_count() est 8 octets?

Voir en direct: https://godbolt.org/g/3Sz8Xj

Répondre

1

Il est un bug qui est fixé dans Boost 1,65

+0

Merci pour ça. On dirait que le bug a été introduit en 1.59; les versions antérieures ne semblent pas affligées. Pouvez-vous me dire où est le bogue? C'est assez mystérieux pour moi après avoir regardé le code. J'ai trouvé ce billet: https://svn.boost.org/trac10/ticket/12894 mais il semble viser à résoudre un problème possiblement lié mais différent. Ce que je ne comprends pas, c'est comment 'size_type' est' uint32_t', mais cette fonction qui retourne 'size_type' renvoie' uint64_t'. Sûrement il y a de la magie noire ici. –

+0

Non, j'ai principalement juste comparé le comportement (parce que cela a juste fonctionné avec 1.65 pour moi, j'ai eu de la chance). J'avais brièvement regardé les changelogs (inexistants) et commettais l'histoire mais sans suspect immédiat. – sehe