On Mon, Sep 29, 2014 at 8:49 PM, Andrzej Krzemienski
Hi Everyone, I know it may be premature to to think about removing every cycle in Boost, but while looking at the cycle reports I found that at least one library is using boost::none, for a purpose different than indicating an uninitialized boost::optional. It is in Boost.Functional:
https://github.com/boostorg/functional/blob/master/include/boost/functional/...
It uses none_t as a default type for a template type parameter Allocator.
My question is: what do we want boost::none_t to indicate, at least in Boost? 1. A value-semantic alternative to void, that anyone can use? 2. A tag indicating boost::optional<T> without a value?
The answer to this question dictates how we should untie the cycle. I know it is too soon to care about small cycles right now, but my question is more about "the principles".
In my view that use of none_t is not justified. I'm not sure if it can be safely replaced with something different to remove the dependency, but I think it should be done, even if it means breaking some code. There are many different placeholders for "unspecified" template parameters, such as mpl::na_, iterators::use_default, fusion::void_, etc. Historically, every library used its own placeholder type for that purpose. I, for one, usually use void for that, when possible (and I guess it should be used for all but purely type manipulation libraries). We could have a common "empty" placeholder type, and if we have one, Boost.Core is probably the best place for it. But that would require modification of the libraries that currently use their own types for that.