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
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. –
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