On 02/10/18 18:43, Peter Dimov via Boost wrote:
But, if you really wanted to know, libstdc++ in a situation like the above (when the function has to be virtual because it's f.ex. specified that way by the standard) does something like the following:
#if cpp11
virtual int __f( boost::function
const& F ) = 0; virtual int f( std::function const& F ) = 0; #else
virtual int f( boost::function
const& F ) = 0; virtual int __f( std::function const& F ) = 0; #endif
except of course we don't have std::function in C++03 mode, so even declaring __f will be a problem.
If you rely on the particular algorithm of vftable slot allocation, declaring is not a problem - you can declare pretty much whatever virtual function. It's not going to be called anyway and its sole purpose is to reserve a particular slot. libstdc++, though, has the luxury of knowing the slot allocation algorithm, as well as binary layout of its own components (e.g. std::string vs. std::__cxx11::string), so it can do stuff like that and even better (e.g. it can actually transparently support both string types, where needed). In an external generic library like Boost, this is a pretty risky thing to do. Just always using ABI-stable types in the link interface seems more preferable.