On 2/8/2018 9:20 AM, Peter Dimov via Boost wrote:
Edward Diener wrote:
As far as which library to use, depending on the compiler/version available, either boost or std, of two very similar libraries, this is what my Cxx_dual library (https://github.com/eldiener/cxx_dual) is all about.
That's not going to work at all if link compatibility is desired. If you have
class something { private:
CXXD::function
f_; public:
// ... };
the layout of `something` changes between C++03 and C++11, which leads to incredibly nasty things at runtime as objects appear at the wrong address and the observed behavior makes no sense.
I discuss a solution for this in the documentation topic "Use in a non-header only library".
I inadvertently introduced such a problem in Boost.System when I made the object layout dependent on whether
was available, to enable conversions from/to std::error_code. It's not fun at all. (I have since fixed that, and added tests that link to the library from a forced-03 or forced-11 main.cpp. Incidentally, the layout of std::string also changes between 03 and 11, so if such compatibility is desired, you can't use that either.) (But there's absolutely no need to use std::function "for std::bind compatibility". boost::function can store std::bind just fine (and vice versa.))