On 10/10/2017 12:31, Niall Douglas wrote:
On 10/10/2017 00:15, Vinnie Falco wrote:
On Mon, Oct 9, 2017 at 10:34 AM, Niall Douglas wrote:
The only correct and safe way to use error categories is from a shared library. In header only mode, multiple instances may appear and thus no longer be proper singletons. Stuff breaks in this situation, badly.
If this is true, and I hope that it is not, then we better do something about it and soon, because forcing header-only libraries that want to provide their own error categories to put them in a shared library is a non-starter.
Nothing we can do. WG21 is still thinking about how to solve it properly. All attempts until now to fix the base cause of it have run into quicksand.
Short of magic compiler changes (and possibly OS changes, since it would require having a symbol from multiple shared libraries loaded at the same address), probably the only way to resolve that is to not require singletons -- which means that code that does pointer comparisons on categories has to be hunted down and replaced with code that compares some internal id that is common to all intended-to-be-identical categories, which in turn requires that someone explicitly define a suitably unique id for each custom category. Which is a breaking API contract change and a performance reduction and adds the problem of managing unique category ids. (And ensures hilarity will ensue if someone doesn't use a unique id for different categories.) The other way to prevent the problem is to guarantee that error codes are never passed across shared object boundaries, but I think we can probably agree that in most cases that's a non-starter. Although it is something that header-only libraries are perhaps slightly more likely to get away with (by then pushing the problem to the application author).