
Jeffrey Hellrung wrote:
The templated constructor should be explicit, because otherwise things like
boost::initialized<std::vector<int> > v = 10;
would compile. IMHO, it's okay if implicit conversions that would normally work for the contained type don't work, since this errs on the side of safety, but it isn't okay to make all conversions implicit.
Agreed.
Leaving out the "explicit" keyword from the initialized(const T&) constructor of initialized<T> won't make Steven's example compile (as I wrote before). In what particular situation would you need to use boost::initialized<T>, including the new initialized(const T&) constructor, instead of just the old value_initialized<T>? I think /the/ motivating use case for boost::initialized<T> is about member data initialization: template <typename T> class foo { std::string m_name; boost::initialized<T> m_data; public: foo(); foo(const foo&); foo(const T&, std::string); }; In this case, some of foo's constructors may want m_data to be value-initialized, but others need to do direct-initialization. Do you agree that its support for member data initialization would be the main reason for having boost::initialized<T>?
And I don't think the boost::direct_initialized tag is necessary, MSVC compiler bugs be damned.
Sorry, I'm not sure what you mean. It's certainly important to me to have something that works on MSVC. Kind regards, Niels -- Niels Dekker http://www.xs4all.nl/~nd/dekkerware Scientific programmer at LKEB, Leiden University Medical Center