
Note that C++0x also adds the bitset(const char*) constructor. As proposed by LWG issue #778, by Thorsten Ottosen: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3019.html#778
On 2010-03-07 14:51, Bo Persson wrote:
And it says that the effect should be as if constructed by bitset(string(str)). This makes it illegal to use a null pointer, like 0, as this is not allowed for std::string.
Well, the bitset(const char*) constructor was never intended to be called when doing std::bitset<5> bits(0); And in C++98/C++03, such an initialization will call the bitset(unsigned long) constructor, which is entirely legal.
The int constructor looks like an MS special that was added in the release candidate. I was wondering if it was added to help out with this other bug: https://connect.microsoft.com/VisualStudio/feedback/details/500122/bitset-5-...
Which then isn't a bug at all, but explicitly disallowed by the standard [lib.string.cons].
Microsoft added the bitset(int) constructor, in order to preserve C++98 backward compatibility, when a user has set all bits to zero by doing std::bitset<N>(0). Which is nice. (And the C++ Standard allows an implementation some freedom to add extra member function overloads, according to the section "Member functions", [member.functions].) But unfortunately, by doing so, MSVC broke another C++98 use case, initializing an std::bitset<N> by an unsigned long. Which is what boost/libs/utility/swap/test/std_bitset.cpp does. Thanks for your feedback, Kind regards, Niels -- Niels Dekker http://www.xs4all.nl/~nd/dekkerware Scientific programmer at LKEB, Leiden University Medical Center