Is this use of reinterpret_cast undefined behaviour?

Viewed 57

I'm not sure about this piece of code:

#include <functional>
#include <list>
#include <iostream>

void f() { std::cout << "HI!\n"; }

struct fobj
{
    void operator()() const { std::cout << "Bye!\n"; }
};

using slot_t = std::function<void()>;
std::list<slot_t> slot_list;

template<class F>
inline std::size_t insert_slot(F f)
{
    auto it = slot_list.insert(slot_list.begin(), f);
    return reinterpret_cast<std::size_t>(&*it);
}

inline slot_t& recover_slot(std::size_t conn_id)
{ return *reinterpret_cast<slot_t*>(conn_id); }

int main()
{
   std::size_t conn1_id = insert_slot(f);
   std::size_t conn2_id = insert_slot(fobj());

   recover_slot(conn1_id)(); // HI!
   recover_slot(conn2_id)(); // Bye!
}

I don't see the reinterpret_cast<T*>(some_size_t) any different from static_cast<T*>(some_void_ptr), but I'm not really sure how risky the former is.

0 Answers
Related